提问人:static_rtti 提问时间:9/12/2012 更新时间:12/18/2020 访问量:168068
在 C 代码中表示 EOF?
Representing EOF in C code?
答:
EOF 不是一个字符(在大多数现代操作系统中)。它只是在到达文件流的末尾时应用于文件流的条件。之所以出现混淆,是因为用户可以通过键入特殊字符(例如 Unix、Linux 等中的 Control-D)来向控制台输入发出 EOF 信号,但该字符不会被正在运行的程序看到,它作系统捕获,而操作系统又会向进程发出 EOF 信号。
注意:在一些非常古老的操作系统中,EOF是一个字符,例如CP / M中的Control-Z,但这是一个粗略的黑客,以避免在文件系统目录中维护实际文件长度的开销。
评论
EOF
扩展为整数常量表达式,类型为 int
和负值,由多个函数返回以指示文件结束,即不再有来自流的输入;和“FGETC
函数获取 [下一个] 字符作为转换为 int
的无符号字符
”。因此,在任何系统上,EOF 都不同于任何 .getchar()
sizeof(char) != sizeof(int)
char
这依赖于系统,但通常是 -1。看这里
有一个 int 类型的常量,可在 stdio.h 中找到。任何标准都没有指定的等效字符文本。EOF
不。EOF 不是字符,而是文件句柄的状态。
虽然 ASCII 字符集中有一些控制字符表示数据的结束,但这些字符通常不用于表示文件的结束。例如,EOT (^D),在某些情况下,它几乎发出相同的信号。
当标准 C 库使用有符号整数返回字符并使用 -1 作为文件末尾时,这实际上只是指示发生错误的信号。我没有可用的 C 标准,但引用 SUSv3:
如果设置了流的文件结束指示器,或者如果流处于文件末尾,则应设置流的文件结束指示器,并且 fgetc() 应返回 EOF。如果发生读取错误,则应设置流的错误指示器,fgetc() 将返回 EOF,并应设置 errno 以指示错误。
我认为它可能因系统而异,但检查的一种方法是仅使用printf
#include <stdio.h>
int main(void)
{
printf("%d", EOF);
return 0;
}
我在 Windows 上执行了此操作并打印到控制台。希望这会有所帮助。-1
评论
EOF
不是一个字符。它不能是:(二进制)文件可以包含任何字符。假设您有一个字节不断增加的文件,即 0 1 2 3 ...255 再次 0 1 ...255,总共 512 个字节。无论您认为这 256 个可能的字节中的哪一个,文件都会被剪短。EOF
这就是为什么 et al. 返回一个 .可能的返回值的范围是 a 可以具有的值,加上一个真正的值(在 中定义)。这也是为什么在检查之前将返回值转换为 a 不起作用的原因。getchar()
int
char
int
EOF
stdio.h
char
EOF
请注意,某些协议具有“EOF”“字符”。ASCII 有“文本结束”、“传输结束”、“传输块结束”和“媒体结束”。其他答案提到了旧的操作系统。我自己在 Linux 上输入 ^D,在 Windows 控制台上输入 ^Z 以停止提供程序输入。(但是通过管道读取的文件可以在任何地方使用 ^D 和 ^Z 字符,并且只有在字节用完时才会发出 EOF 信号。C 字符串以字符结尾,但这也意味着它们不能包含字符 .这就是为什么所有 C 非字符串数据函数都使用数组(包含数据)和 a(知道数据结束的位置)工作。'\0'
'\0'
char
size_t
编辑:C99标准§7.19.1.3规定:
宏是 [...]
EOF
扩展为具有类型和负值的整数常量表达式,由多个函数返回给 表示文件末尾,即不再有来自流的输入;int
评论
((charVar = getchar()) == EOF)
char
EOF
int
char
EOF
((intVar = getchar()) == EOF)
unsigned char
int
EOF
EOF
char
fgets
char *
char x
EOF
fputc
EOF
fgetc
unsigned char
int
EOF
feof
char
EOF
Windows 上的命令解释器(以及 MSDOS 和 CP/M)识别的字符是 0x1a(十进制 26,又名 + 又名 SUB)EOF
CtrlZ
例如,它今天仍然可以用于标记二进制文件中人类可读标头的末尾:如果文件以开头,用户可以使用命令将文件内容转储到控制台,转储将在字符处停止,即打印一些描述并停止,而不是继续后面的垃圾。"Some description\x1a"
TYPE
EOF
EOF 的价值不能与任何真实角色混淆。
如果 ,那么我们必须声明足够大以容纳任何返回的值。我们不能使用,因为除了字符之外,还必须足够大才能容纳 EOF。a= getchar()
a
getchar()
char
a
评论
a
答案是否定的,但是......
您可能会因为以下行为而感到困惑fgets()
从 http://www.cplusplus.com/reference/cstdio/fgets/ :
从流中读取字符,并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先到者为准。
我已经阅读了所有评论。有趣的是,当你打印出这个时会发生什么:
printf("\nInteger = %d\n", EOF); //OUTPUT = -1
printf("Decimal = %d\n", EOF); //OUTPUT = -1
printf("Octal = %o\n", EOF); //OUTPUT = 37777777777
printf("Hexadecimal = %x\n", EOF); //OUTPUT = ffffffff
printf("Double and float = %f\n", EOF); //OUTPUT = 0.000000
printf("Long double = %Lf\n", EOF); //OUTPUT = 0.000000
printf("Character = %c\n", EOF); //OUTPUT = nothing
正如我们在这里看到的,EOF不是一个角色(无论什么)。
评论
EOF
double
0xFFFFFFFF
%x
double
0x00
我一直在研究很多关于EOF信号的知识。在 Dennis Ritchie 的 C 编程一书中,在介绍 putchar() 和 getchar() 命令时首次遇到它。 它基本上标志着字符串输入的末尾。
例如。让我们编写一个程序来寻找两个数字输入并打印它们的总和。您会注意到,在每次数字输入后,您按 Enter 键以标记已完成 iput 操作的信号。但是,在处理字符串时,Enter 仅被读取为另一个字符 ['\n': 换行符]。要标记输入的终止,请在全新的行中输入 ^Z(在键盘上按 Ctrl + Z),然后输入。这表示要执行的下一行命令。
#include <stdio.h>
int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();
while (c != EOF)
{
++i;
c = getchar();
};
printf("NUMBER OF CHARACTERS %d.", i);
return 0;}
以上是计算字符数的代码,包括 '\n'(换行符)和 '\t'(空格)字符。如果您不想计算换行符,请执行以下操作:
#include <stdio.h>
int main()
{
char c;
int i = 0;
printf("INPUT:\t");
c = getchar();
while (c != EOF)
{
if (c != '\n')
{
++i;
}
c = getchar();
};
printf("NUMBER OF CHARACTERS %d.", i);
return 0;}.
现在主要思考 HOOW 提供输入。这很简单: 写下你想要的所有故事,然后进入一个新行并输入^Z,然后再次输入。
评论