对文件的输入输出
-
源程序文件(后缀为.c),目标文件(后缀为.obj),可执行文件(后缀为.exe)
-
FILE
的头文件#include<stdio.h>
-
FILE *fp; if((fp=fopen("file","r"))==NULL){ //NULL的值为0,在头文件stdio.h中 cout<<"ERROR!"; exit(0); //exit函数在头文件stdlib.h中 } fclose(fp);
-
怎样向文件读写字符
fgetc(fp); //读失败返回文件结束标志EOF(-1) fputc(ch,fp); //读失败返回文件结束标志EOF(-1)
-
ch=fgetc(in); while(!feof(in)){ fputc(ch,out); ch=fgetc(in); }
while(!feof(in))
等价于while(ch!=-1)
等价于while(ch!=EOF)
-
putc和fputc作用是一样的;getc和fgetc作用是一样的;
-
怎样向文件读写一个字符串
fgets(str,n,fp); //从fp指向的文件读入一个长度为n-1的字符串,存放到字符数组str中 //读成功,返回地址str,失败返回NULL fputs(str,fp); //输出成功,返回0;否则返回非0值
-
打开磁盘文件
fp=fopen("D:\\CC\\string.dat","w")
-
fgets函数规定:读入字符串时,如果遇到’\n’就结束字符串输入,’\n’作为最后一个字符页读入到字符数组。
-
用格式化的方式读写文本文件(花费时间较多,最好不用)
fprintf(文件指针,格式字符串,输出列表); fscanf(文件指针,格式字符串,输入列表);
-
用二进制方式向文件读写一组数据
fread(buffer,size,count,fp); //从文件中读一个数据块 fwrite(butter,size,count,fp); //向文件写一个数据库 /*如果函数fread和fwrite执行成功,则函数返回值为count*/
/*从fp1中读入数据块,向fp2写入数据块*/ struct Student{ char name[10]; int num; double score; }stu[10]; for(int i=0;i<10;++i) fread(&stu[i],sizeof(struct Student),1,fp1); for(int i=0;i<10;++i) fwrite(&stu[i],sizeof(struct Student),1,fp2);
-
用rewind函数使文件位置标记指向文件开头,此函数无返回值
-
用fseek函数改变文件位置标记:
fseek(文件类型指针,位移量,起始点)
0(SEEK_SET)表示“文件开始位置”;1(SEEK_CUR)表示“当前位置”;2(SEEK_END)表示”文件末尾位置“。
**位移量是long型数据(**在数字的末尾加一个字母L)
fseek(fp,100L,0); //将文件位置标记向前移动到离文件开头100个字节处 fseek(fp,50L,1); //将文件位置标记向前移动到离当前位置50个字节处 fseek(fp,-10L,2); //讲文件位置标记从文件末尾处向后退10个字节
/*读入奇数学生数据*/ struct Student{ char name[10]; int num; double score; }stu[10]; for(int i=0;i<10;i+=2){ fseek(fp,i*sizeof(struct Student),0); fread(&stu[i],sizeof(struct Student),1,fp); }
-
用ftell函数测定文件位置标记的当前位置(用相对于文件开头的位移量来表示)
如果调用函数时出错(如文件不存在),ftell函数的返回值为-1L
i=ftell(fp); if(i==-1L) cout<<"ERROR!";
-
在调用各种输入输出函数时,如果出现错误,可以用ferror函数检查。调用形式
ferror(fp)
如果返回值为0,表示未出错;否则表示出错
对同一个文件每一次调用输入输出函数,都会产生一个新的ferror函数值。因此,应在调用一个输入输出函数后立即检查ferror函数的值
在执行fopen函数时,ferror函数的初始值自动置为0
-
clearerr函数的作用是使文件出错标志和文件结束标志置为0
假如在调用一个输入输出函数时出现错误,ferror函数值为一个非零值。应立即调用
clearerr(fp)
只要出现文件读写出错标志,它就一直保留,直到对同一文件调用clearerr函数或rewind函数或任何其它一个输入输出函数