9

总是EOF消极的?

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

4

6 回答 6

16

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

在对该标准的第二次阅读(以及根据此处的其他一些评论)它似乎EOF总是负面的 - 对于这个问题中指定的用途(行号或EOF)它会起作用。我要警告(并且仍然这样做)的意思是假设角色是积极的和EOF消极的。

请记住,符合标准的 C 实现可能具有负字符值 - 这甚至在“C 编程语言”(K&R)中提到。印刷字符总是正面的,但在某些架构(可能都是古老的)上,控制字符是负面的。C 标准没有指定char类型是有符号还是无符号,唯一保证跨平台具有相同值的字符常量是'\0'.

于 2009-10-26T10:24:12.127 回答
12

是的,EOF 总是负数。

该标准说:

7.19 输入/输出
7.19.1 简介

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

char请注意,“plain”被签名没有问题。<stdio.h>处理s的函数char,专门将字符转换为unsigned char,然后转换为int,以便所有有效字符都具有正值。例如:

int fgetc(FILE *stream)

7.19.7.1
... fgetc 函数将该字符作为无符号字符转换为 int ...

于 2009-10-26T10:46:20.290 回答
8

让那个函数返回

  • 找到单词的行号
  • 或 -1 如果已到达输入的末尾

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

于 2009-10-26T10:26:52.783 回答
2

在线草稿 n1256 , 17.9.1.3 :

EOF

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

EOF 总是负数,尽管它可能并不总是-1。

对于这样的问题,我更喜欢通过返回错误代码(SUCCESS, END_OF_FILE,READ_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;
}      
于 2009-10-26T18:34:47.463 回答
1

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

于 2009-10-26T10:29:59.323 回答
1

来自维基百科

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

但是没有参考...

从安全编码:检测并处理输入和输出错误 EOF 为负,但仅当sizeof(int) > sizeof(char)时。

于 2009-10-26T10:30:57.270 回答