【问题标题】:fgets c standard library functionfgets c 标准库函数
【发布时间】:2017-02-19 00:37:44
【问题描述】:
/ * fgets:  get at most n chars from iop * / 

char * fgets(char * s, int n, FILE * iop) 
{ 
    register int c;
    register char * cs; 
    cs = s; 
    while (-n > 0 && (c = getc(iop)) != EOF) 
        if (( * cs++ = c) == ′\n′) 
            break; 
    *cs = ′\0′; 
    return (c == EOF && cs == s) ? NULL : s; 
 }

请问我的问题是为什么在 return 语句中使用 cs == s。由于 fgets 应该返回 NULL,如果文件结束或发生错误,为什么 return 语句不只是 return (c == EOF) ?空:s;

getc 也是一个 c 标准库函数,它从 iop 指向的文件中一次读取一个字符。函数 fgets 从 iop 指向的文件中读取一行,如果成功,则返回读取的行,存储在字符数组 s 中。如果遇到文件结尾或发生错误,则返回 NULL

干杯

【问题讨论】:

  • getc,也是一个c标准库函数,每次从iop指向的文件读取一个字符。函数 fgets 从 iop 指向的文件中读取一行,如果成功,则返回读取的行,存储在字符数组 s 中。如果遇到文件结尾或发生错误,则返回 NULL

标签: c


【解决方案1】:

为什么返回语句不只是return (c == EOF) ? NULL : s;

因为如果cs != s那么显然在文件结束之前成功读取了一些字节或遇到错误,如果fgets()在到达之前成功读取某些内容,则返回NULL显然是错误的文件的结尾。

【讨论】:

  • 这是一条线,来自 c book(K & R) 中的编程——通常 fgets 返回线;在文件结束或错误时,它返回 NULL。根据书,上面的 fgets 实现是从标准库中复制而来的
  • 这是一条线,来自 c book(K & R) 中的编程——通常 fgets 返回线;在文件结束或错误时,它返回 NULL。根据这本书,上面的 fgets 实现是从标准库中复制的。所以如果 c == EOF && cs != s, s 将被返回。但是 c == EOF
  • @user3856947:是的,没错。如果文件的最后一个字符不是换行符,则每次读取文件的最后一行时都会发生这种情况。在这种情况下,fgets() 读取最后一行,到达文件末尾,然后返回最后一行。这就是它应该如何工作的方式。如果它不能以这种方式工作,您将永远无法读取此类文件的最后一行。 下一次调用fgets(),假设文件没有改变,它仍然在文件末尾,但是现在没有数据要读取,所以然后 它将返回NULL
  • 干杯保罗。最后一件事,保罗,我很快就会读完 C 书 (K&R) 中的编程,目前我正在编写控制台应用程序。你能在之后的非控制台现实生活应用程序中推荐我用c编程吗?欢呼
猜你喜欢
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-03
相关资源
最近更新 更多