换行符在C代码中由"\n"
表示。是否有等效的文件结束(EOF)字符?
答案 0 :(得分:58)
EOF不是一个角色(在大多数现代操作系统中)。它只是在到达流末尾时应用于文件流的条件。之所以产生混淆,是因为用户可以通过键入特殊字符(例如,Unix,Linux,等等中的Control-D)来信号 EOF以获得控制台输入,但此字符不是在运行程序中可以看到它被操作系统捕获,而操作系统又将EOF发送给过程。
注意:在一些非常旧的操作系统中,EOF 是一个字符,例如CP / M中的Control-Z,但这是一个粗略的黑客,以避免在文件系统目录中维护实际文件长度的开销。
答案 1 :(得分:7)
没有。 EOF不是字符,而是文件句柄的状态。
虽然ASCII字符集中有控制字符代表数据的结尾,但这些字符通常不用于表示文件的结尾。例如EOT(^ D),在某些情况下几乎发出相同的信号。
当标准C库使用有符号整数返回字符并使用-1作为文件末尾时,这实际上只是指示发生错误的信号。我没有C标准,但引用SUSv3:
如果设置了流的文件结束指示符,或者流位于文件结尾,则应设置流的文件结束指示符,并且fgetc()将返回EOF。如果发生读错误,则应设置流的错误指示符,fgetc()应返回EOF,并设置errno以指示错误。
答案 2 :(得分:6)
EOF
不是角色。它不能是:(二进制)文件可以包含任何字符。假设你有一个不断增加的字节的文件,0 1 2 3 ... 255和0 1 ... 255,总共512字节。无论你认为EOF
这256个可能的字节中的哪一个,该文件都将缩短。
这就是getchar()
等人的原因。返回int
。可能的返回值范围是char
可以具有的值,加上真正的int
值EOF
(在stdio.h
中定义)。这也是为什么在检查char
之前将返回值转换为EOF
的原因。
请注意,某些协议具有“EOF”“字符”。 ASCII具有“文本结束”,“传输结束”,“传输块结束”和“中等结束”。其他答案都提到了旧的操作系统。我自己在Linux上输入^ D,在Windows控制台上输入^ Z以停止提供程序输入。 (但是通过管道读取的文件可以在任何地方都有^ D和^ Z字符,并且当它们用完字节时只发出EOF信号。)C字符串以'\0'
字符终止,但这也意味着它们不能包含字符'\0'
。这就是为什么所有C非字符串数据函数都使用char
数组(包含数据)和size_t
(知道数据结束位置)的原因。
编辑:C99标准§7.19.1.3规定:
宏是[...] 的 EOF 强>
它扩展为一个整数常量表达式,类型为int
,负数值由多个函数返回 表示文件结束,即不再有来自流的输入;
答案 3 :(得分:3)
我已阅读所有评论。有趣的是注意到打印出来时会发生什么:
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不是一个角色(无论如何)。
答案 4 :(得分:1)
Windows上的命令解释程序识别的EOF字符(以及MSDOS和CP / M)是0x1a(十进制26,又名Ctrl + Z又称SUB)
今天仍然可以使用它来标记二进制文件中人类可读标题的结尾:如果文件以&#34开头;某些描述\ x1a"用户可以使用TYPE命令将文件内容转储到控制台,转储将停止在EOF 字符,即打印某些描述并停止,而不是继续随后的垃圾。
答案 5 :(得分:1)
EOF的价值不能与任何真实角色混淆。
如果a= getchar()
,那么我们必须声明a
足够大,以保留getchar()
返回的任何值。我们无法使用char
,因为除了字符之外,a
必须足够大才能保留EOF。
答案 6 :(得分:1)
答案是否定的,但是......
由于fgets()
来自http://www.cplusplus.com/reference/cstdio/fgets/:
从流中读取字符并将其作为C字符串存储到str中,直到读取(num-1)个字符或到达换行符或文件结尾为止,以先发生者为准
答案 7 :(得分:0)
这取决于系统,但通常为-1。见here
答案 8 :(得分:0)
在stdio.h中有int类型的常量EOF
。任何标准都没有指定等效的字符文字。
答案 9 :(得分:0)
我认为它可能因系统而异,但一种检查方法是使用printf
#include <stdio.h>
int main(void)
{
printf("%d", EOF);
return 0;
}
我在Windows上执行了此操作,-1
已打印到控制台。希望这会有所帮助。
答案 10 :(得分:0)
我一直在研究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;}.
现在要输入的主要思想。这很简单: 写下您想要的所有故事,然后换行,输入^ Z,然后再次输入。