------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
1. 文件概念和分类
文件:存储在外部介质上数据的集合,这个数据集有一个名称叫做文件名。
文件分类
ASCII文件(文本文件):存放每一个字符对应的ASCII值,把ASCII值转换成二进制保存。
二进制文件:按二进制编码的方式存储文件。
文件操作步骤:
引入头文件(stdio.h)
定义文件指针
打开文件
文件读写
关闭文件
2. 文件的打开与关闭
在C语言中用一个指针变量指向一个文件
FILE *指针变量标示符 eg:FILE *fp;
文件的打开——fopen
FILE *fopen(文件名,文件打开方式);//打开成功,返回文件首地址,打开失败返回null
文件关闭函数——fclose
int fclose(文件指针变量); //有错返回非0,否则返回0
fputc(char ch,FILE *p); //将字符ch写入到fp指向的文件中
fgetc(FILE *p); //从fp指向的文件中读取一个字符
r:打开一个已经存在的文本文件,准备读取数据,不能写入数据
w:创建一个新文件,准备向里面写入数据,不能从文件读取数据,如果文件已经存在,则文件将会被覆盖
a:向文本文件尾追加数据,不能从文件中读取数据,如果文件不存在则创建文件
r+:打开一个已经存在的文件,准备读写
w+:创建一个新文件,向里面读写数据,如果文件已经存在则覆盖原文件
a+:向文本文件尾追加数据,可以从文件读取数据
t:打开一个文本文件
b:打开一个二进制文件
示例代码:
//从键盘输入一个字符串,写到文件中,再显示到屏幕上
int main(int argc, const char * argv[]) {
//定义一个文件指针
FILE *fp=NULL;
//用读写方式打开文件
fp=fopen("eva.txt", "w+");
if (fp!=NULL) {
printf("请输入要写入文件的字符串:");
//从键盘输入一个字符
char ch=getchar();
while (ch!='\n') {
fputc(ch, fp);
//继续从键盘输入字符
ch=getchar();
}
}else{
printf("文件打开失败!");
}
//把文件内部指针重新指向文件首地址
rewind(fp);
//从文件中读取一个字符
char ch=fgetc(fp);
//如果文件没有结束把读取的字符输出
while (ch!=EOF) {
putchar(ch);
//继续读取下一个字符
ch=fgetc(fp);
}
fclose(fp);
return 0;
}
字符串读写函数
fputs(字符串,指针); //把字符串写入到指针变量指向的文件中,返回值是写入的字符串的长度
fgets(char *buf,int n,FILE *fp); //从指针变量fp指向的文件中读取长度为n-1的字符串保存到起始地址为buf的内存空间中。
示例代码如下:
//从键盘输入一个字符串,写到文件中,再显示到屏幕上
int main(int argc, const char * argv[]) {
//定义一个文件指针
FILE *fp=NULL;
//以读写方式打开文件
fp=fopen("sally.txt", "w+");
//判断文件是否打开成功
if (fp!=NULL) {
char str[100];
printf("请输入要保存的字符串:");
//从键盘输入一个字符串
scanf("%s",str);
//把输入的字符串保存到文件中
fputs(str, fp);
}else{
printf("文件打开失败!");
}
//把文件内部指针重新指向文件首地址
rewind(fp);
char str1[100];
//从文件中读取出内容保存到字符数组中
fgets(str1, sizeof(str1), fp);
puts(str1);
fclose(fp);
return 0;
}
注意:fgets从文件中读取字符串时遇到\n读取结束
数据块读取函数:
int fread(char *pt,unsigned size,unsigned n,FILE *fp); //从fp指定的文件中读取n个长度为size的数据项,保存到pt指向的内存区
int fwrite(char *ptr,unsigned size,unsigned n,FILE *fp); //把ptr所指向的n*size个字节写入到fp指向的文件中
示例代码如下:
/**
从键盘输入两个学生数据,写入一个文件中,再读取这两个学生的数据显示到屏幕上
*/
#include <stdio.h>
#define LEN 100
//定义一个结构体
typedef struct Student{
char name[LEN];
int age;
int score;
}MyStu;
int main(int argc, const char * argv[]) {
MyStu stuent[2];
//从键盘输入学生信息
for (int i=0; i<2; i++) {
printf("请输入第%d个学生的姓名:",i+1);
scanf("%s",stuent[i].name);
printf("\n请输入第%d个学生的年龄:",i+1);
scanf("%d",&stuent[i].age);
printf("\n请输入第%d个学生的成绩:",i+1);
scanf("%d",&stuent[i].score);
}
//定义一个文件指针并打开文件
FILE *fp=fopen("a.txt", "w+");
if (fp!=NULL) {
//把学生信息写到文件中
for (int i=0; i<2; i++) {
fwrite(&stuent[i], sizeof(MyStu), 1, fp);
}
}
//把文件内部指针重新指向文件首地址
rewind(fp);
//定义一个结构体数组
MyStu stu[2];
for (int i=0; i<2; i++) {
//把从文件中读取出的信息保存到结构体中
fread(&stu[i], sizeof(MyStu), 1, fp);
printf("\n第一个学生信息是:%s\t%d\t%d\t",stu[i].name,stu[i].age,stu[i].score);
}
//关闭文件
fclose(fp);
return 0;
}
格式化读写函数
fscanf(文件指针,格式字符串,输入列表);//按指定格式把数据从文件中读出
fprint(文件指针,格式字符串,输出列表); //按指定格式把数据写入文件
示例代码如下:
/**
*使用fprintf和fscanf向文件中写入一个二维数组,并读取出来
*/
#include <stdio.h>
int main(int argc, const char * argv[]) {
int a[3][3]={1,2,3,4,5,6,7,8,9};
//定义一个文件指针并打开
FILE *fp=fopen("fprintf.txt", "w+");
//判断文件是否打开成功
if (fp!=NULL) {
for (int i=0; i<3; i++) {
fprintf(fp, "%d,%d,%d#",a[i][0],a[i][1],a[i][2]);
}
}
//把文件内部指针移到文件首
rewind(fp);
//定义一个数组接收从文件中读取的数据
int b[3][3];
for (int i=0; i<3; i++) {
fscanf(fp, "%d,%d,%d#",&b[i][0],&b[i][1],&b[i][2]);
}
//打印出二维数组中的数据
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
printf("%d\t",b[i][j]);
}
}
return 0;
}