C语言文件读写的操作
1.文件打开
FILE *fp=fopen("dat.dat","w");
第一个参数可以是绝对路径,也可以是相对路径。
用相对路劲要和源程序在一个文件夹下
绝对路径要用两个反斜杠,不然会有歧义
第二个参数是打开文件的方式
运行后,会在路径的目录下生成两个文件
2.文件关闭
fclose(fp);
这个函数会清空缓存区的数据
3.读写文件
- 以字符形式读写
fputc(ch,fp);
函数 fputc() 把参数 c 的字符值写入到 fp 所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回 EOF。
FILE *fp=fopen("dat.dat","w"); fputc('a',fp); fclose(fp);
FILE *fp=fopen("dat.dat","r"); char ch=fgetc(fp); printf("%c",ch);
从键盘输入一行字符写入文件
#include<stdio.h> #include<stdlib.h> int main() { FILE *fp; if((fp=fopen("dat.dat","w"))==NULL)//判断文件是否能正常打开 { printf("Open error!"); exit(0); } char ch; while((ch=getchar())!='\n')//每次从键盘读取一个字符,写入文件 { fputc(ch,fp); } fclose(fp); return 0; }
读取文件的内容,打印在屏幕上
#include<stdio.h> #include<stdlib.h> int main() { FILE *fp; if((fp=fopen("dat.dat","r"))==NULL) { printf("Open error!"); exit(0); } char ch; while((ch=fgetc(fp))!=EOF)//读到文件末尾时停止 { printf("%c",ch); } return 0; }
- 以字符串形式读写
#include<stdio.h> #include<stdlib.h> int main() { FILE *fp; if((fp=fopen("dat.dat","a"))==NULL) { printf("Open error!"); exit(0); } char ch[20]; gets(ch); fputs(ch,fp);//将字符串写入 fclose(fp); return 0; }
读取到的字符串会在末尾自动加上'\0',因此实际上只读到了n-1个字符
fgets(str,n,fp);有局限性,遇到换行会停下,每次只能读取一行
- 以数据块形式读写
读取多行内容需要使用 fwrite(*ptr,size,n,fp); 相应地写入为 fread(*ptr,size,n,fp);
ptr为内存中地指针,可以为数组、变量、结构体等;
#include<stdio.h> #include<stdlib.h> //输入一个数组,写入文件再读取 int main() { int a[10],b[10]; for(int i=0;i<10;i++) scanf("%d",&a[i]); FILE *fp; if((fp=fopen("dat.dat","w"))==NULL) { printf("Open error!"); exit(0); } fwrite(a,sizeof(int),10,fp); rewind(fp);//将文件位置读写标记移到最开头 fclose(fp); fp=fopen("dat.dat","r"); fread(b,sizeof(int),10,fp); for(int i=0;i<10;i++) printf("%d ",b[i]); fclose(fp); return 0; }
文件打开为乱码,数组会以二进制地方式存入。
#include<stdio.h> #include<stdlib.h> //生成学生成绩数据写入文件,按照平均分从高到低排序读取文件 struct Student{ long num; int score[5]; float average; }; int comp(const void *p1,const void *p2) { return (*(struct Student*)p1).average<(*(struct Student*)p2).average?1:-1; } int main() { struct Student stud[10],stud1[10]; srand((unsigned int)time(NULL)); for(int i=0;i<10;i++)//生成分数 { stud[i].average=0; for(int j=0;j<5;j++) { stud[i].score[j]=rand()%(100-60+1)+60; stud[i].average+=stud[i].score[j]; } stud[i].average/=5; } for(int i=0;i<10;i++)//生成学号 stud[i].num=19020001+i; for(int i=0;i<10;i++)//排序前 { printf("%ld:",stud[i].num); for(int j=0;j<5;j++) { printf("%d ",stud[i].score[j]); } printf("%.2f ",stud[i].average); putchar(10); } FILE *fp; if((fp=fopen("stud.dat","wb"))==NULL)//创建文件 printf("Open error!\n"); for(int i=0;i<10;i++) { fwrite(&stud[i],sizeof(struct Student),1,fp);//写入文件 } fclose(fp);//关闭文件 //读入文件 fp=fopen("stud.dat","rb"); for(int i=0;i<10;i++) { fread(&stud1[i],sizeof(struct Student),1,fp);//写入文件 } qsort(stud1,10,sizeof(stud[0]),comp);//按平均分排序 for(int i=0;i<10;i++) { printf("%ld %.2f\n",stud1[i].num,stud1[i].average); } return 0; }
- 格式化读写
fscanf()、fprintf() 和scanf()、printf()功能类似,前者操作对象是磁盘文件,后者操作对象是标准输入输出设备。
格式为:
fscanf(fp,格式控制字符串,地址表列)
fprintf(fp,格式控制字符串,输出表列)
- 随机读写
移动文件位置指针的函数 rewind(fp)、fseek(fp,偏移量,基点)
参考:http://c.biancheng.net/view/2075.html
4.feof(fp)函数
测试是否到达文件末尾,但不引起读写动作
https://blog.csdn.net/qq_33706673/article/details/78308466