EOF总是负面的吗?

EOF总是负面的吗?

我正在考虑编写一个函数来读取输入中的下一个单词并返回找到该单词的行号,如果已达到输入的结尾,则返回EOF。 如果EOF不一定是负数,则函数将是不正确的。

是的,EOF总是消极的。

标准说:

7.19输入/输出
7.19.1简介

3宏是EOF,扩展为整数常量表达式,类型为int,负值,由多个函数返回,表示文件结束,即不再有来自流的输入;

请注意,签署“普通” char没有问题。 处理char函数,特别是将字符转换为unsigned char ,然后转换为int ,以便所有有效字符都具有正值。 例如:

 int fgetc(FILE *stream) 

7.19.7.1
… fgetc函数将该字符作为转换为int的unsigned char获取…

EOF总是== EOF 。 不要假设其他任何事情。

在标准的二读(并且根据此处的一些其他评论),似乎EOF总是负的 – 并且对于在该问题中指定的用途(行号或EOF),它将起作用。 我打算警告(并且仍然这样做)的意思是假设字符为正,而EOF为负。

请记住,标准符合C的实现可能具有负字符值 – 甚至在’C编程语言’(K&R)中也提到过。 打印字符总是正面的,但在某些体系结构(可能是所有古代)上,控制字符都是负面的。 C标准没有指定char类型是有符号还是无符号,并且唯一保证在平台上具有相同值的字符常量是'\0'

有那个function返回

  • 找到该单词的行号
  • 如果已到达输入的末尾,则返回-1

问题解决了,无需依赖任何EOF值。 呼叫者可以轻松地测试成功呼叫的大于或等于零,否则假设为EOF / IO错误。

从在线草案 n1256,17.9.1.3:

EOF

它扩展为一个整数常量表达式,类型为int,负值,由几个函数返回,表示文件结束 ,即不再有来自流的输入;

EOF总是负数,但可能并不总是-1。

对于这样的问题,我更喜欢通过返回错误代码( SUCCESSEND_OF_FILEREAD_ERROR等)作为函数的返回值来将错误条件与数据分离,然后将感兴趣的数据写入单独的参数,例如

 int getNextWord (FILE *stream, char *buffer, size_t bufferSize, int *lineNumber) { if (!fgets(buffer, bufferSize, stream)) { if (feof(stream)) return END_OF_FILE; else return READ_ERROR; } else { // figure out the line number *lineNumber = ...; } return SUCCESS; } 

EOF是一个条件,而不是一个值。 该sentinel的确切值是实现定义的。 在很多情况下,它是一个负数。

来自维基百科 :

EOF的实际值是一个依赖于系统的负数,通常为-1,保证不等于任何有效的字符代码。

但没有参考……

来自安全编码: 检测并处理输入和输出错误 EOF是否定的,但仅限于sizeof(int)> sizeof(char) 。