Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的文件结尾(EOF)_C_Eof - Fatal编程技术网

C语言中的文件结尾(EOF)

C语言中的文件结尾(EOF),c,eof,C,Eof,我目前正在读里奇和克尼汉的书《C编程语言》。我对EOF在getchar()函数中的用法感到非常困惑 首先,我想知道为什么EOF的值是-1,为什么getchar()的值是-1=EOF为0。请原谅我的问题,但我真的不明白。我真的试过了,但是不行 然后我试着在书上运行这个例子,它可以使用下面的代码计算字符数,但似乎即使我按enter键,我也永远不会跳出循环,所以我想知道什么时候才能到达EOF main(){ long nc; nc = 0; while (getchar() != E

我目前正在读里奇和克尼汉的书《C编程语言》。我对EOF在
getchar()
函数中的用法感到非常困惑

首先,我想知道为什么EOF的值是-1,为什么
getchar()的值是-1=EOF
为0。请原谅我的问题,但我真的不明白。我真的试过了,但是不行

然后我试着在书上运行这个例子,它可以使用下面的代码计算字符数,但似乎即使我按enter键,我也永远不会跳出循环,所以我想知道什么时候才能到达EOF

main(){
   long nc;
   nc = 0;
   while (getchar() != EOF)
       ++nc;
   printf("%ld\n", nc);
}
然后,我在上读到了同样的问题。大多数人建议不要使用EOF,而是使用终止符\n或空终止符“\0”,这很有意义


这是否意味着书中的例子还有另一个用途

这是很多问题

  • 为什么
    EOF
    是-1:在POSIX系统调用中,通常会在出错时返回-1,所以我猜这个想法是“EOF是一种错误”

  • 任何布尔运算(包括!=)如果为真则返回1,如果为假则返回0,因此
    getchar()!=EOF
    为FALSE时为
    0
    ,表示
    getchar()
    返回
    EOF

  • 要想在从
    stdin
    读取时模拟
    EOF
    ,请按Ctrl+D

  • EOF表示“文件结束”。换行符(按enter键时发生的情况)不是文件的结尾,而是行的结尾,因此换行符不会终止此循环

    代码没有错[*],只是没有达到您期望的效果。它读到输入的末尾,但您似乎只想读到一行的末尾

    EOF的值为-1,因为它必须不同于实际字符
    getchar
    的任何返回值。因此,
    getchar
    以无符号字符的形式返回任何字符值,并将其转换为int,因此int将是非负的

    如果您在终端上键入,并且希望引发文件结束,请使用CTRL-D(unix样式系统)或CTRL-Z(Windows)。然后在读取所有输入后,
    getchar()
    将返回
    EOF
    ,因此
    getchar()!=EOF
    将为false,循环将终止


    [*]如果由于整数溢出,输入超过了LONG_MAX个字符,那么它有未定义的行为,但在一个简单的例子中,我们可能可以原谅这一点。

    EOF是-1,因为它是这样定义的。该名称由您包含的标准库标题提供。它们使它等于-1,因为它必须是不能被误认为是
    getchar()
    读取的实际字节
    getchar()
    使用正数(0到255,包括0到255)报告实际字节的值,因此-1适用于此

    =运算符表示“不相等”。0代表false,其他任何东西都代表true。因此,我们调用
    getchar()
    函数,并将结果与-1(EOF)进行比较。如果结果不等于EOF,那么结果就是真的,因为不相等的东西是不相等的。如果结果等于EOF,则结果为假,因为相等的事物不(不相等)

    调用
    getchar()
    在到达“文件末尾”时返回EOF。就C而言,“标准输入”(通过在命令窗口中键入而提供给程序的数据)就像一个文件。当然,你总是可以输入更多,所以你需要一个明确的方式说“我完成了”。在Windows系统上,这是control-Z。在Unix系统上,这是control-D


    书中的例子并不“错”。这取决于你真正想做什么。阅读直到EOF意味着你阅读所有内容,直到用户说“我完成了”,然后你就不能再阅读了。读取到“\n”表示您读取了一行输入。如果您希望用户键入输入,那么一直读到“\0”是个坏主意,因为在命令提示符下用键盘很难或不可能生成此字节:)

    您确实知道您提到的书是由C语言的原始作者编写的,对吗?布尔运算返回非零表示真,返回零表示假。这是有区别的。不,运算符被定义为返回1。在布尔上下文(例如,
    if()
    while()
    条件)中,任何非零值都是“true”。我现在知道了问题所在。。这就是为什么我看不到结果。。这是因为我使用的是Dev-C++并且它没有系统(“暂停”),所以我需要在代码的末尾键入它。它只是终止您的终端,而内核又知道无法读取更多字节,因此标准输入文件描述符中没有可用数据。@newbie
    system
    函数创建一个新shell并运行传递给它的命令。该命令由系统外壳程序执行,与编译器whatsoeverIf无关。如果您按回车键“enter”,“getchar()”,则只需查看一个字符和“nc”变量即可。