intmain(){FILE *fp;char buffer[N];if((fp =fopen("E:\\test.txt","w"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}/*往文件中寫入*/fputs("I love FishC.com\n",fp);fputs("I love China\n",fp);fputs("I love my parent",fp);fclose(fp);if((fp =fopen("E:\\test.txt","r"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}/*讀取*/while(!feof(fp)){fgets(buffer,N,fp);printf("%s\n",buffer);}return0;}
案例2
intmain(){FILE *fp;char buffer[N];if((fp =fopen("E:\\test.txt","w"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}/*往文件中寫入*/fputs("I love FishC.com\n",fp);fputs("I love China\n",fp);fputs("I love my parent\n",fp);//出問題的一行fclose(fp);if((fp =fopen("E:\\test.txt","r"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}/*讀取*/while(!feof(fp)){fgets(buffer,N,fp);printf("%s\n",buffer);}return0;}
NOTE: 若在讀取字符中遇到EOF,則eof指示器被設(shè)置;但是如果再沒有讀到任何字符之前就遇到了EOF,則str指示器指向的位置保持原來的位置不變,即“I love my parent”被讀取了兩次。
3.3 讀取寫入一組數(shù)據(jù)
用到的函數(shù)
fread(buffer,size,count,fp)
buffer:讀取到的數(shù)據(jù)的存放地址
size:要讀取的字節(jié)數(shù)
count:要讀取多少個size字節(jié)的數(shù)據(jù)項
fp:從fp指向文件中讀取
fwrite(buffer,size,count,fp)
buffer:要寫入的數(shù)據(jù)的存放地址
size:要讀取的字節(jié)數(shù)
count:要寫入多少個size字節(jié)的數(shù)據(jù)項
fp:往fp指向文件中寫入
案例 先向一個文件中吸入一組數(shù)據(jù),然后再讀出。
#include<stdio.h>#include<stdlib.h>#define N 3struct Stu
{int num;char name[24];float score;}stu[N];intmain(){FILE *fp;int i;struct Stu temp;for(i =0;i < N;i++){scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);}if((fp =fopen("E:\\test1.txt","wb"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}for(i =0;i < N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp)!=1){printf("寫入文件失敗\n");}}fclose(fp);/*讀取文件*/if((fp =fopen("E:\\test1.txt","rb"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}for(i=0;i<N;i++){fread(&temp,sizeof(struct Stu),1,fp);printf("num = %d,name = %s,socre = %.2f\n",temp.num,temp.name,temp.score);}fclose(fp);return0;}
四、文件隨機讀寫
用到的函數(shù)
fseek(文件指針,位移量,起始點)
文件指針:再哪個文件中進行操作
位移量:從起始點開始,位置指針移動多少
起始點:從哪個位置開始
rewind()
使位置指針重新返回文件的開頭
ftell()
得到位置指針的當前位置,用相對于文件開頭的位移量來表示
案例 先向文件中寫入4個學生的數(shù)據(jù),然后讀取第2個學生的數(shù)據(jù)。
#include<stdio.h>#include<stdlib.h>#define N 3struct Stu
{int num;char name[24];float score;}stu[N],somebody;intmain(){FILE *fp;int i;printf("請輸入學生的相關(guān)信息\n");for(i =0;i < N;i++){scanf("%d %s %f",&stu[i].num,stu[i].name,&stu[i].score);}if((fp =fopen("E:\\text2.txt","w"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}for(i=0;i<N;i++){if(fwrite(&stu[i],sizeof(struct Stu),1,fp)!=1){printf("文件打開失敗\n");}}fclose(fp);if((fp =fopen("E:\\text2.txt","r"))==NULL){printf("文件打開失敗\n");exit(EXIT_FAILURE);}printf("當前位置指針:%d\n",ftell(fp));fseek(fp,sizeof(struct Stu),0);fread(&somebody,sizeof(struct Stu),1,fp);printf("num = %d, name = %s, score = %f",somebody.num,somebody.name,somebody.score);fclose(fp);return0;}