对文件的操作是通过一些库函数来实现。常用的文件操作函数有:
(1)fopen函数:打开数据文件(2)fclose函数:关闭数据文件(3)fputs函数:将字符串写入文件 (4)fgets函数:从文件读取字符串(5)fprintf函数:以指定的格式将数据输出,写入文件中 (6)fscanf函数:以指定的格式从文件中读取数据 (7)fread函数:以二进制方式从文件中读取一组数据 (8)fwrite函数:以二进制的方式向文件写入一组数据 对文件读写之前应该“打开”该文件,在使用结束之后应“关闭”该文件。 “打开”:指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出数据)。 “关闭”:指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,无法再进行文件读写操作。
(1)用fopen函数打开数据文件
fopen函数的调用方式: fopen(文件名,使用文件方式);
如: fopen(“D:\\a1”,”r”);
文件名和使用方式分别用双引号引起来。
u打开D盘的“a1”文件,路径中的一个\,要用两个\\表示。因为一个\是作为转义字符标志。
u使用文件方式为“读” ,打开后将对文件执行读操作
ufopen函数的返回值是指向a1文件的指针
通常将fopen函数的返回值赋给一个指向文件的指针变量。
如:FILE *fp;
fp=fopen(“D:\\a1”,”r”);
fp与文件a1相联系,或说fp指向文件 a1。
打开文件时,通知编译系统3个信息:
①需要访问的文件名。如无后缀,默认为dat数据文件。
② 使用文件的方式(“读”还是“写”等)
③ 让哪一个指针变量指向被打开的文件,通过哪个指针变量对文件进行操作。
Ø说明:
①用“r”方式打开文件后,只能从该文件读取数据,向计算机输入数据。
条件:文件存在并存有数据,才能从文件中读数据。
不能用“r”方式打开一个并不存在的文件,否则出错。
② 用“w”方式打开文件后,只能向该文件写数据,即输出数据。
u若文件不存在,则在打开文件前新建立一个以指定的名字命名的文件。
u若文件已存在,则在打开文件前先将该文件删去,然后重新建立一个新文件。
③ 用“a”方式打开文件,可向文件末尾添加新的数据(保留原有数据)。
u条件:文件存在。
u打开文件时,文件读写标记移到文件末尾。
④ 用r+、w+、a+方式打开的文件,既可以读数据,又可以写数据。
ur+方式:该文件已经存在。
uw+方式:新建立一个文件,先向此文件写数据,然后可以读此文件中的数据。
ua+方式:保留文件内容,文件读写标记移到文件末尾,可添加内容,也可读取。
以上几种方式是对文本文件进行操作。
⑤在每种方式后面加字母b, 如rb,wb, 是对二进制文件进行操作,使用方式不变,只是操作的文件类型不同。如rb,r为只读,b表示打开的文件为二进制文件。
⑥ 如果打开失败,fopen函数将带回一个空指针值NULL
常用方法:
if ((fp=fopen(“D:\\a1”, ″r″))==NULL)
{ printf(“cannot open this file\n”);
exit(0); //终止正在执行的程序
}
(2)用fclose函数关闭数据文件
fclose函数调用形式: fclose(文件指针);
如: fclose (fp);
u把fp指向的文件关闭,fp不再指向该文件。
u如果不关闭文件将会丢失数据,应当养成程序终止前关闭所有文件。
(3)用fputs函数向文件写字符串(fileputstring ,简称fileputs)
调用形式:fputs(str,fp)
把str所指向的字符串写到fp所指向的文件中
写成功,返回0;否则返回EOF (文件结束符)
(4)用fgets函数从文件读取字符串(filegetstring,简称filegetstring)
调用形式: fgets(str,n,fp)
从fp指向的文件读取长度为(n-1)的字符串,最后加一个‘\0’,共n个字符存
放到字符数组str中。
读成功,返回地址str,失败则返回NULL
例:从键盘输入3个字符串,按字母大小顺序排序,将排好序的字符串保存到磁盘文件中。
Ø解题思路:
u从键盘输入3个字符串,存放在一个二维字符数组中;
u对字符数组中的3个字符串按字母顺序排序;(可用冒泡排序或选择排序)
u将排好序的字符串输出到文件中。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{ FILE *fp; //定义指向文件的指针变量
char str[3][10],temp[10]; //定义二维字符数组str存放三个字符串
int i,j,k ; temp数组进行交换
printf(“Enter strings:\n”);
for(i=0;i<3;i++)
gets(str[i]); //输入3个字符串,存放在str数组中
//用选择法对字符串排序
for(i=0;i<2;i++) //3个字符串交换2次
{ k=i; // k记录最小字符串的下标
for(j=i+1;j<3;j++) //和后面的字符串比较,遇到更小的字符串,
if(strcmp(str[j],str[k])<0) k=j; 用k记录其下标
strcpy(temp,str[i]); //每次将最小的字符串和str[i]交换
strcpy(str[i],str[k]);
strcpy(str[k],temp);
} //实现字符串由小到大排序
if((fp=fopen(“D:\\s.dat”, “w”))==NULL) //打开D盘文件s,用于写数据
{ printf("can't open file!\n"); 打开失败,则显示提示信息
exit(0); //终止正在执行的程序
} //打开成功
printf("\nThe new sequence:\n");
for(i=0;i<3;i++)
{ fputs(str[i],fp); //将str[i]中的字符串写入fp指向的文件
fputs(“\n”,fp); //写入’\n’,将写入文件的字符串分隔
printf(“%s\n”,str[i]); //并将str数组中排好序的字符串输出到终端
}
fclose(fp);
}
思考: 从文件s中读回字符串,并在屏幕上显示,应如何编写程序?
用fgets函数从文件中读取字符串。
#include <stdio.h>
#include <stdlib.h>
void main()
{ FILE *fp;
char str[3][10]; int i;
if((fp=fopen(“D:\\s.dat”, “r”))==NULL)
{ printf("can't open file!\n");exit(0); }
for(i=0;i<3;i++)
{ fgets(str[i],10,fp); //从fp指向的文件读取9个字符,如遇\n,读入结束
printf("%s",str[i]); } //将文件中读取的字符在终端显示,进行验证
fclose (fp);
}
(5)用fprintf函数格式化写文件(fileprintformat,简称fileprint)
fprintf函数以指定的格式将数据输出,即写入文件;fscanf函数以指定的格式输入,即读取文件。
调用方式为:
fprintf(文件指针,格式字符串,输出表列);
fprintf (fp,”%d,%6.1f”,i,f);
将整型变量i和实型变量f的值按%d和%6.1f的格式输出到fp指向的文件中。
#include <stdio.h>
void main()
{
int i;
float f;
FILE *fp;
i=3;
f=1.2345;
fp=fopen("D:\\t.dat","w");
fprintf(fp,"%d,%6.2f",i,f);
fclose(fp);
}
(6)用fscanf函数格式化读文件(filescanformat,简称filescanf)
fscanf (文件指针,格式字符串,输入表列);
如: fscanf (fp,”%d,%f”,&i,&f);
从文件中读取整数和实数送给变量i和f。
#include <stdio.h>
void main()
{
int i;
float f;
FILE *fp;
fp=fopen("D:\\t.dat","r");
fscanf(fp,"%d,%f",&i,&f);
printf("i=%d,f=%f\n",i,f);
fclose(fp);
}
fprintf和fscanf函数都是对文本文件进行操作,可用其他函数对二进制文件进行读写
操作。如fread和fwrite函数。
(7)用fread函数以二进制方式读文件(fileread)
调用形式为:
fread(buffer,size,count,fp);
从fp所指向的文件中读取一组数据送到内存
(8)用fwrite函数以二进制方式写文件(filewrite)
调用形式:
fwrite(buffer,size,count,fp);
将内存中一组数据以二进制的形式写入文件
Øbuffer:是一个地址
ufread,从文件中读出数据,将数据存放在内存哪里(地址),由buffer指定
ufwrite,将内存哪个地址开始的数据输出, 写入文件
Øsize:读写的字节数
Øcount:读写数据项的个数
Øfp:FILE类型指针
例:从键盘输入3个学生的有关数据,然后把它们转存到磁盘文件上去。
解题思路:
u定义3个元素的结构体数组,存放学生的数据
u输入学生的数据
u用fwrite函数实现向磁盘输出学生数据
#include <stdio.h>
struct student
{ int num;
char name[10];
float score;
} s[3]; //定义结构体数组s,包含3个学生的数据
void main()
{ int i;
FILE *fp;
for(i=0;i<3;i++)
scanf("%d%s%f",&s[i].num, s[i].name,&s[i].score); //输入3个学生的数据
fp=fopen("stu","wb"); //打开文件,wb,二进制写方式
for(i=0;i<3;i++)
fwrite(&s[i],sizeof(struct student), 1,fp); //将数组s中的每条记录
fclose(fp); 写入文件
}
程序运行后,屏幕上并无输出信息,只是将从键盘输入的数据写入磁盘文件。
用以下程序从“stu.dat”文件中读入数据,然后在屏幕上输出。
void main()
{ int i;
FILE *fp;
fp=fopen("stu","rb");
for(i=0;i<3;i++)
{ fread(&s[i],sizeof(struct student), 1,fp); //从文件中读取学生记录
printf("%d,%s,%f\n",s[i].num,s[i].name,s[i].score); } 存放在s数组中
fclose(fp); }

