1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > C语言之文件读写探究(三):fputs fgets feof(一次读写一行字符(文本操作))

C语言之文件读写探究(三):fputs fgets feof(一次读写一行字符(文本操作))

时间:2020-10-12 21:05:47

相关推荐

C语言之文件读写探究(三):fputs fgets feof(一次读写一行字符(文本操作))

相关博文:C语言之文件读写探究(一):fopen、fclose(文件的打开和关闭)

相关博文:C语言之文件读写探究(二):fputc、fgetc、feof(一次读写一个字符(文本操作))

相关博文:C语言之文件读写探究(三):fputs、fgets、feof(一次读写一行字符(文本操作))

相关博文:C语言之文件读写探究(四):fwrite、fread(一次读写一块数据(二进制操作))

相关博文:C语言之文件读写探究(五):rewind、ftell、fseek(文件指针偏移)

相关博文:C语言之文件读写探究(六):fscanf、fprintf(格式化读写文件)

相关博文:C语言之文件读写探究(七):随机读写文件

行的定义

行是文本编辑器中的概念,文件流中就是一个字符。这个在不同的平台是有差异的。window平台’\r\n’,linux平台是’\n’。

平台差异

windows平台在写入’\n’是会体现为’’,linux平台在写入’\n’时会体现为’\n’。windows平台在读入’\r\n’时,体现为一个字符’\n’,linux平台在读入’\n’时,体现为一个字符’\n’。

linux读windows中的换行,则会多读一个字符,windos读linux中的换行,则没有问题。

测试1:写入

测试2:

fputs

例1:

附例1代码:

//小问学编程#include<stdio.h>int main( ){FILE* fp=fopen("hello.txt","w");if(fp==NULL){printf("open error\n");return -1;}printf("%d\n",fputs("1234567890\n",fp));//0 or -1char buf[]="xyz";printf("%d\n",fputs(buf,fp)); //0 or -1fclose(fp);return 0;}

fgets

按行读取,重点是判断,结束条件是什么?通常的作法是依据返回值。

例2:

附例2代码:

//小问学编程#include<stdio.h>#define N 1024//N-1个字符前遇到了\n EOF//1->abcd\n+\0//2->abcd1234567+\0//还没有遇到\n EOF 读取的数据到了上限//3->abc+\0int main(){FILE* pf=fopen("hello.txt","w+");if(pf==NULL)exit(-1);fputs("abcd\n1234567",pf);//fputs("abcd1234567",pf);rewind(pf);char buf[N];while(fgets(buf,N-1,pf))printf("%s",buf);fclose(pf);}int main2(){FILE* pf=fopen("hello.txt","w+");if(pf==NULL)exit(-1);fputs("abcd\n1234567",pf);//fputs("abcd\n1234567",pf);rewind(pf);char buf[N];//遇到\n EOF的时候返回非空,在EOF以后,再去读,NULLprintf("%p\n",fgets(buf,N-1,pf));printf("%p\n",fgets(buf,N-1,pf));printf("%p\n",fgets(buf,N-1,pf));//fgets(buf,N-1,pf);//fgets(buf,4,pf);puts(buf);fclose(pf);}int main1(){FILE* pf=fopen("hello.txt","w+");if(pf==NULL)exit(-1);fputs("abcd\n1234567",pf);//fputs("abc1234567",pf);rewind(pf);char buf[N];fgets(buf,N-1,pf);//fgets(buf,N-1,pf);//fgets(buf,4,pf);puts(buf);fclose(pf);return 0;}

feof

如果最后一行,没有行’\n’的话则少读一行。

linux中无论是gedit还是vim系统会自动在末位添加\n标志。Windows当中要注意系统不会自动添加\n,最好用返回值来判断,是否读到尾。

例3:

附例3代码:

//小问学编程#include<stdio.h>int main(){FILE* fp=fopen("hello.txt","w+");if(fp==NULL)return -1;fputs("aaaaaaaaaaaaaaa\n",fp);fputs("bbbbbbbbbbbbbbb\n",fp);fputs("ccccccccccccccc\n",fp);fputs("ddddddddddddddd\n",fp);fputs("eeeeeeeeeeeeeee\n",fp);fputs("fffffffffffffff",fp);rewind(fp);char buf[30]={0};while(fgets(buf,30,fp)&&!feof(fp))//取最后一行的时候feof已经认为空了{printf("%s",buf);}fclose(fp);return 0;}

注意事项

读到 buf 内的字符串,可含有空白格式控制字符,比如 ‘\n’ ‘\r\n’ ‘\t’ 等,如果直接用作比较等用途,可能得不到正确的结果。

下面例子调用多次fputs函数将几个字符串写入文件中,然后调用fgets函数读取并打印到屏幕上:

例4:

附例4代码:

//小问学编程#include<stdio.h>#include<stdlib.h>#define MAX 1024int main(){FILE* fp;char buffer[MAX];if((fp=fopen("hello.txt","w"))==NULL){printf("打开文件失败!\n");exit(-1);}fputs("what a pretty girl!\n",fp);fputs("what a cool boy!\n",fp);fputs("I am your friend!\n",fp);fclose(fp);//重新打开文件if((fp=fopen("hello.txt","r"))==NULL){printf("打开文件失败!\n");exit(-1);}while(!feof(fp)){fgets(buffer,MAX,fp);printf("%s",buffer);}fclose(fp);return 0;}

分析:feof函数用于检测eof指示器是否被设置,如果检测到文件末尾指示器被设置,返回一个非0值;否则返回0。

注意:

在这个程序中先关闭再重新打开hello.txt文件,这样做是为了确保内容都写入了文件中,并从文件头开始读取字符串。

程序出了一点小意外,第三行字符串打印了两次,但是查看hello.txt文件的内容却是正确的。

分析:这是因为fgets函数一旦遇到换行符(’\n’)就会停止本次字符串的读取,而在最后一行字符串读取完成之后,并没有遇到EOF(是换行符导致了本次读取结束),所以它还要多读取一次,但是这一次除了读取到EOF就没有其他内容了,因此buffer字符串的内容并没有被新的内容所覆盖。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。