目录
1. 打开与关闭文件
头文件:<stdio.h>
用fopen函数打开数据文件
所谓“打开”是指为文件建立相应的信息区和文件缓冲区。
ANSI C规定了用标准输入输出函数fopen来实现打开文件:
用法:fopen(文件名,使用文件方式),如
fopen("a1","r");
fopen函数的返回值是指向a1文件的指针变量(即a1文件信息区的起始地址)。通常将fopen函数的返回值赋给一个指向文件的指针变量。如
FILE *fp;
fp=fopen("a1","r");
这样fp就和文件a1相联系了,或者说fp指向了文件。
使用文件的方式:
- r: 只读方式,文件必须存在
- w: 只写方式,若文件存在,则原有内容会被清除;若文件不存在,则会建立文件
- a: 追加方式打开只写文件,只允许进行写操作,若文件存在,则添加的内容放在文件末尾;若不存在,则建立文件
- +: 可读可写
- b: 以二进制方式打开文件
- t: 以文本方式打开文件(默认方式下以文本方式打开文件)
常见的组合:
- r:
以只读的方式打开文件,只允许读,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部 - r+:
以可读可写的方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部 - rb+:
以可读可写、二进制方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部 - rt+:
以可读可写、文本方式打开文件,允许读写,此文件必须存在,否则返回NULL,打开成功后返回文件指针,位置指针指向文件头部 - w:
以只写的方式打开文件,只允许写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部 - w+:
以读写的方式打开文件,允许读写,若文件存在,文件中原有内容会被清除;若文件不存在,则创建文件,打开成功后返回文件指针,位置指针指向文件头部 - a:
以追加、只写的方式打开文件,只允许写。若文件存在,则追加的内容添加在文件末尾,若文件不存在,则创建文件。打开成功后返回文件指针,位置指针指向文件头部(注意很多书上或资料上讲述追加方式打开成功后位置指针指向文件末尾是错误的) - a+:
以追加、可读写的方式打开文件,允许读写。若进行读操作,则从头开始读;若进行写操作,则将内容添加在末尾。若文件不存在,则创建文件。打开成功后返回文件指针,位置指针指向文件头部。
常用文件打开方式:
if((fp=fopen("file1","r"))==NULL){
printf("cannot open this file\n");
exit(0);
}
用fclose函数关闭数据文件
用法:fclose(文件指针),如
fclose(fp);
关闭文件的目的是防止结束程序时数据丢失。因为向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件,当数据未充满缓冲区时程序结束运行,有可能使缓冲区的数据丢失。
用fclose函数关闭文件时,会先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。
fclose函数也带回一个值,当成功的执行了关闭操作,则返回为0,否则返回EOF(-1)。
2. 对文件进行读写
printf和scanf函数向终端进行格式化的输入输出。
fprintf和fscanf函数向文件进行格式化的输入输出。
用fscanf从文件进行读入数据
用法:fscanf(文件指针,格式化字符串,出入表列),如:
fscanf(fp,"%d,%f",&i,&f);
用fprintf将数据写入文件
用法:fprintf(文件指针,格式化字符串,输出表列),如:
fprintf(fp,"%d,%6.2f",i,f)
3. 读写字符
用fgetc从文件读出字符
用法:fgetc(fp),从fp指向的文件读入一个字符,读成功带回所读字符,失败则返回文件结束标志EOF
用fputc将字符写入文件
用法:fputc(ch,fp),把字符ch写到文件指针变量fp所指向的文件中,输出成功返回值就是输出的字符,输出失败则返回EOF。
在访问磁盘文件时,是逐个字符(字节)进行的,每访问完一个字节后,当前读写位置自动后移。为了知道对文件读写是否完成,即检测文件尾标志是否已被读取过(文件的所有有效字符后有一个文件尾标志,用标识符EOF表示)。用feof函数可检测文件尾标志是否被读取过,若已读过,返回值为1,否则为0。
4. 读写字符串
用fgets从文件读出字符串
用法:fgets(str,n,fp);
即从fp指向的文件读入一个长度为(n-1)的字符串(最后加一个’\0’),存放到字符数组str中,返回值为地址str或NULL。
如果读完字符串之前遇到’\n’或EOF,读入结束,’\n’也作为一个字符读入。
用fputs将字符串写入文件
用法:fputs(str,fp);
即把str所指向的字符串写到文件指针变量fp所指向的文件中。
输出成功,返回0,否则返回非0值
5. 用二进制方式向文件读写一组数据
用fread从文件中读出一组数据
用法:fread(buffer,size,count,fp);
从文件读入count个size大小的数据项,放在地址buffer中。
用fwrite将一组数据写入文件
用法:fwrite(buffer,size,count,fp);
把从地址buffer开始的存储区中的数据向文件输出。
在读写时以二进制形式进行的,向磁盘写数据时,直接将内存中一组数据原封不动、不加转换的复制到磁盘文件上。
fread或fwrite函数的类型为int型,如果执行成功,则返回值为形参count的值,即输入或输出数据项的个数。
6. 关于文件位置标记的函数
rewind函数
rewind函数使文件位置标记指向文件开头,无返回值。
用法:rewind(文件指针类型),如:
rewind(fp)
fseek函数
用法:fseek(文件类型指针,位移量,起始点),如
fseek(fp,100L,0);//将文件位置标记向前移到离开头100个字节处
fseek(fp,50L,1); //将文件位置标记向前移到离当前位置50个字节处
fseek(fp,-10L,2); //将文件位置标记从末尾处向后退10个字节
7. 例程
#include<stdio.h>
#include<stdlib.h>
void main(){
//打开文件
FILE *fp;
fp=fopen("data.txt","a+"); //data文件的位置请注意
if(fp==NULL)
{
printf("error\n");
exit(0); //exit在头文件stdlib.h中
}
//从data文件读入数据
int year=0,lon=0,lat=0;
double pre=0;//年份 经度 纬度 降雨量
fscanf(fp,"%d %d %d %lf",&year,&lon,&lat,&pre);
year++;
//向data文件写入数据
fprintf(fp,"\n%d %d %d %.2lf",year,lon,lat,pre);
//从data文件读入字符
rewind(fp);
char c;
c=fgetc(fp);
//向data文件写入字符,需要先rewind一下
rewind(fp);
fprintf(fp,"\n");
if(fputc(c,fp)==EOF){
printf("\nerror");
exit(0);
}
//从data文件读入字符串
fseek(fp,3L,0); //将文件位置标记向前移到离开头3个字节处
char A[8];
fgets(A,8,fp); //获得长度为7(即8-1)的字符串
//向data文件输出字符串
rewind(fp);
fprintf(fp,"\n");
fputs(A,fp);
//关闭文件
fclose(fp);
}
data.txt文件的原内容:
程序运行后,data.txt的内容为: