EOF总是负面的吗?
我正在考虑编写一个函数来读取输入中的下一个单词并返回找到该单词的行号,如果已达到输入的结尾,则返回EOF。如果EOF不一定是负数,那么函数就不正确。
答案 0 :(得分:15)
EOF总是== EOF
。不要假设其他任何事情。
在标准的二读(并且根据此处的其他评论),EOF似乎总是负面的 - 并且对于在该问题中指定的用途(行号或EOF),它将起作用。我打算警告(现在仍然如此)假设字符为正,EOF为负。
请记住,标准符合C的实现可能具有负字符值 - 甚至在'C编程语言'(K& R)中也提到过。打印字符总是正面的,但在某些体系结构(可能是所有古代)上,控制字符都是负面的。 C标准没有指定char
类型是有符号还是无符号,并且唯一保证在不同平台上具有相同值的字符常量为'\0'
。
答案 1 :(得分:10)
是的,EOF总是消极的。
标准说:
7.19输入/输出
7.19.1简介3宏是[...] EOF 扩展为整数常量 表达式,类型为int和a 负值,由...返回 几个功能来表明 文件结束,即不再输入 来自溪流;
请注意,签署“普通”char
没有问题。处理<stdio.h>
的{{1}}函数专门将字符转换为char
,然后转换为unsigned char
,以便所有有效字符都具有正值。例如:
int
7.19.7.1
... fgetc函数将该字符作为无符号字符转换为int ...
答案 2 :(得分:8)
让该功能返回
问题解决了,无需依赖任何EOF值。呼叫者可以轻松测试成功呼叫的大于或等于零,否则会假设EOF / IO错误。
答案 3 :(得分:2)
来自online draft 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;
}
答案 4 :(得分:1)
EOF是一种条件,而不是一种价值。该sentinel的确切值是实现定义的。在很多情况下,这是一个负数。
答案 5 :(得分:1)
来自wikipedia:
EOF的实际值是a 系统相关的负数, 通常-1,保证是 不等于任何有效的字符代码。
但没有参考......
来自安全编码:Detect and handle input and output errors EOF是否定的,但仅限于sizeof(int) > sizeof(char)。