新闻资讯
看你所看,想你所想

fgets

fgets

fgets函式功能为从指定的流中读取数据,每次读取一行。其原型为:char *fgets(char *str, int n, FILE *stream);从指定的流 stream 读取一行,并把它存储在 str 所指向的字元串内。当读取 (n-1) 个字元时,或者读取到换行符时,或者到达档案末尾时,它会停止,具体视情况而定。

基本介绍

  • 中文名:fgets
  • 外文名:fgets
  • 功能:读取数据
  • 函式使用:键盘输入fgets(buf,n,stdin)
  • 长度:n-1个字元的字元串
  • 头档案:stdio.h

fgets函式语法

函式原型

char *fgets(char *str, int n, FILE *stream);

参数

  • str-- 这是指向一个字元数组的指针,该数组存储了要读取的字元串。
  • n-- 这是要读取的最大字元数(包括最后的空字元)。通常是使用以 str 传递的数组长度。
  • stream-- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字元的流。

功能

从指定的流 stream 读取一行,并把它存储在str所指向的字元串内。当读取(n-1)个字元时,或者读取到换行符时,或者到达档案末尾时,它会停止,具体视情况而定。

套用说明

如果档案中的该行,不足n-1个字元,则读完该行就结束。如若该行(包括最后一个换行符)的字元数超过n-1,则fgets只返回一个不完整的行,但是,缓冲区总是以NULL字元结尾,对fgets的下一次调用会继续读该行。函式成功将返回stream,失败或读到档案结尾返回NULL。因此不能直接通过fgets的返回值来判断函式是否是出错而终止的,应该藉助feof函式或者ferror函式来判断。

返回值

如果成功,该函式返回相同的 str 参数。如果到达档案末尾或者没有读取到任何字元,str 的内容保持不变,并返回一个空指针。如果发生错误,返回一个空指针。
  1. 在读字元时遇到end-of-file,则eof指示器被设定,如果还没读入任何字元就遇到这种情况,则stream保持原来的内容,返回NULL;
  2. 如果发生读入错误,error指示器被设定,返回NULL,stream的值可能被改变。

延伸拓展

注意1:《UNIX 环境高级编程》中指出,每次调用fgets函式会造成标準输出设备自动刷清!案例详见《UNIX环境高级编程(第二版)》中程式清单1-5和课后习题5.7,习题5.7的答案中给出了相关的论述。
注意2:初入门者,大多数是在WINDOWS下,使用VS进行练习的。此环境下,对注意1中的情况进行测试,并不能看到案例中所描述的情景,因为具体的实现不同。
stream档案流指针体指向档案内容地址的偏移原则
如果使用fgets()读取某个档案,第一次读取的bufsize为5,而档案的第一行有10个字元(算上'\n'),那幺读取档案的指针会偏移至当前读取完的这个字元之后的位置。也就是第二次再用fgets()读取档案的时候,则会继续读取其后的字元。而,如果使用fgets() 读取档案的时候bufsize大于该行的字元总数加2(多出来的两个,一个保存档案本身的'\n'换行,一个保存字元串本身的结束标识'\0'),档案并不会继续读下去,仅仅只是这一行读取完,随后指向档案的指针会自动偏移至下一行。
例:
如果一个档案的当前位置的文本如下
Love, I Have
Since you can do it.
如果用fgets(str1,6,file1);去读取
则执行后str1 = "Love," ,读取了6-1=5个字元
这个时候再执行fgets(str1,20,file1)则执行后str1 = " I Have\n"
而如果
fgets(str1,23,file1);
则执行str1="Love ,I Have",读取了一行(包括行尾的'\n',并自动加上字元串结束符'\0'),当前档案位置移至下一行,虽然23大于当前行上字元总和,可是不会继续到下一行。而下一次调用fgets()继续读取的时候是从下一行开始读。

示例

#include<string.h>#include<stdio.h>int main ( void ){    FILE*stream;    char string[]="Thisisatest";    char msg[20];/*openafileforupdate*/    stream=fopen("DUMMY.FIL","w+");/*writeastringintothefile*/    fwrite(string,strlen(string),1,stream);/*seektothestartofthefile*/    fseek(stream,0,SEEK_SET);/*readastringfromthefile*/    fgets(msg,strlen(string)+1,stream);/*displaythestring*/    printf("%s",msg);    fclose(stream);    return 0;}
fgets函式用来从档案中读入字元串。fgets函式的调用形式如下:fgets(str,n,fp);此处,fp是档案指针;str是存放在字元串的起始地址;n是一个int类型变数。函式的功能是从fp所指档案中读入n-1个字元放入str为起始地址的空间内;如果在未读满n-1个字元之时,已读到一个换行符或一个EOF(档案结束标誌),则结束本次读操作,读入的字元串中最后包含读到的换行符。因此,确切地说,调用fgets函式时,最多只能读入n-1个字元。读入结束后,系统将自动在最后加'\0',并以str作为函式值返回。

函式使用

同时可以用作键盘输入:fgets(key,n,stdin)且还必须:key[strlen(key)]='\0'或者key[n-1]='\0'
还有种程式经常使用的方法:key[strlen(key-1)]=0x00;
与gets相比使用这个好处是:读取指定大小的数据,避免gets函式从stdin接收字元串而不检查它所複製的快取的容积导致的快取溢出问题。

相关推荐

声明:此文信息来源于网络,登载此文只为提供信息参考,并不用于任何商业目的。如有侵权,请及时联系我们:yongganaa@126.com