初识C语言时,对文件输入输出模块并没有仔细去看,大致浏览了一遍就这样翻过去了 因为考试也不考,所以何必费那些闲工夫啊! 现在看来,C语言的文件输入输出模块对于一名程序员来说是非常有用的东西,没有这些,所有的操作只能说是纸上谈兵,关机之后统统的见鬼去了!近来想想,C语言这东西,挺适合自己自学的,并不是说明个人资质不错,只是学校教的东西,完全可以自己从书上获取,重要的是我们要用自己的双手成就自己的程序! 只有自己亲自实践过,才有自己的体会,这些东西可是灰常重要的! 好了,开始正题!
一、fgetc()与fputc()
#include "stdio.h" #include "stdlib.h" void writefile(FILE *fp) { char ch; printf("请输入文件内容,以#结束! \n"); ch=getchar(); while(ch!='#') { fputc(ch,fp); // fputc(ch,fp) ch=getchar(); } rewind(fp); } void readfile(FILE *fp) { char ch; printf("读取文件内容:\n"); ch=fgetc(fp); while(!feof(fp)) { putchar(ch); ch=fgetc(fp); // ch=fgets(fp) } printf("\n文件读取结束\n"); } int main() { FILE * fp; char inputfile[20]; printf("请输入文件名:"); gets(inputfile); fp=fopen(inputfile,"w+"); if(fp==NULL) { printf("打开文件失败!"); exit (1); } else { printf("打开%s成功!\n",inputfile); } writefile(fp); readfile(fp); fclose(fp); return 0; }
● fgetc()格式 变量=fgetc(文件指针) fputc()格式 fput(字符量,文件指针)
● 若读写失败,都会返回符号常量EOF(在stdio.h中定义),值为-1
● getc()与fgetc()功能相同,putc()与fputc()功能相同
二、fgets()与fputs()
#include "stdio.h" #include "stdlib.h" int main() //编程实现文件的复制 { FILE *fp; char str[100],s[100],filename[50]; printf("请输入字符串:\n"); gets(str); printf("请输入文件所在路径及名称:\n"); scanf("%s",filename); if((fp=fopen(filename,"ab"))!=NULL) { fputs(str,fp); // fputs(str,fp) 把字符串str写入到文件中 fclose(fp); } else { printf("打开失败!"); exit(0); } if((fp=fopen(filename,"rb"))!=NULL) { printf("%s文件的内容是:\n",filename); while(fgets(s,sizeof(s),fp)) // fgets(str,n,fp) 从文件读出n-1字符串到str { printf("%s",s); } fclose(fp); } return 0; }
● 调用格式 fgets(字符数组名,n,文件指针) fputs(字符串,文件指针)
● fgets()会把n-1个字符复制到字符数组里,而不是n个
三、fscanf()与fprintf()
#include "stdio.h" #include "stdlib.h" struct rec { char id[10]; char name[20]; float price; int count; }; // 将键盘输入的信息写到文件中 void writefile(FILE *fp,int n) { int i; struct rec record; // 用作缓冲 printf("******************请输入商品数据********************\n"); for(i=0;i<n;i++) { printf("请输入序号:"); scanf("%s",record.id); printf("请输入名称:"); scanf("%s",record.name); printf("请输入价格:"); scanf("%f",&record.price); printf("请输入数量:"); scanf("%d",&record.count); fprintf(fp,"%s %s %.2f %d \n",record.id,record.name,record.price, record.count); } } // 从文件读出商品信息 void readfile(FILE *fp,int n) { struct rec record; // 用作缓冲 double total =0; rewind(fp); while(fscanf(fp,"%s %s %f %d\n",record.id,record.name, &record.price,&record.count)!=EOF) { printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name, record.price,record.count); total=total+record.price*record.count; } printf("合计:%5.2f",total); } int main() { char filename[20]; int n; FILE * fp; printf("请输入目标文件:\n"); scanf("%s",filename); printf("请输入商品数量:\n"); scanf("%d",&n); fp=fopen(filename,"w+"); if(fp==NULL) { printf("打开文件失败!"); exit(1); } writefile(fp,n); readfile(fp,n); fclose(fp); return 0; }
● 调用格式 fscanf(文件指针,格式字符串,输入参数) 如:fscanf(fp,"%d %s",&i,str)
fprintf(文件指针,格式字符串,输出参数列表) 如:fprintf(fp,"%d %s",i,str)
● 该程序在主函数完成打开、关闭文件 在被调函数中定义缓冲结构体用于数据的输入输出
四、fread()与fwrite()
#include "stdio.h" #include "stdlib.h" struct rec { char id[10]; char name[20]; float price; int count; }; // 将键盘输入的信息写到文件中 void writefile(FILE *fp,int n) { int i; struct rec record; // 用作缓冲 printf("******************请输入商品数据********************\n"); for(i=0;i<n;i++) { printf("请输入序号:"); scanf("%s",record.id); printf("请输入名称:"); scanf("%s",record.name); printf("请输入价格:"); scanf("%f",&record.price); printf("请输入数量:"); scanf("%d",&record.count); // fprintf(fp,"%s %s %.2f %d \n",record.id,record.name,record.price, // record.count); fwrite(&record,sizeof(record),1,fp); } } // 从文件读出商品信息 void readfile(FILE *fp,int n) { struct rec record; // 用作缓冲 double total =0; rewind(fp); // while(fscanf(fp,"%s %s %f %d\n",record.id,record.name, // &record.price,&record.count)!=EOF) while(fread(&record,sizeof(record),1,fp)) { printf("序号:%s 名称:%s 价格:%5.2f 数量:%d \n",record.id,record.name, record.price,record.count); total=total+record.price*record.count; } printf("合计:%5.2f",total); } int main() { char filename[20]; int n; FILE * fp; printf("请输入目标文件:\n"); scanf("%s",filename); printf("请输入商品数量:\n"); scanf("%d",&n); fp=fopen(filename,"ab+"); if(fp==NULL) { printf("打开文件失败!"); exit(1); } writefile(fp,n); readfile(fp,n); fclose(fp); return 0; }
● 格式 fwrite(buffer,size,count,fp) fread(buffer,size,count,fp)
● buffer 存放输入输出数据的首地址 size 数据块的大小(字节数) count 数据块的个数
● 读写成功返回值都是count的值 失败返回0 可以依据此判断文件是否读写结束
Summary:
1. fgetc与fputc 用于读写单个字符
2. fgets与fputs 用于读写一个字符串
3. fscanf与fprintf 用于格式化读写数据块
4. fread与fwrite 用于非格式化读写二进制文件