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ù)項(xiàng)
fp:從fp指向文件中讀取
fwrite(buffer,size,count,fp)
buffer:要寫入的數(shù)據(jù)的存放地址
size:要讀取的字節(jié)數(shù)
count:要寫入多少個size字節(jié)的數(shù)據(jù)項(xiàng)
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;}