为什么我不能通过这个结束我的输入?

时间:2014-11-14 01:39:56

标签: c++ c visual-c++

我想通过输入,EOF(在Windows中为^ Z)终止我的输入,这是程序:

#include<stdio.h>
#include<conio.h>
int main(void)
{
    int c;
    while ((c = getchar()) != EOF)
    {
        if (c == '\t')
        {
            putchar('\\');
            putchar('t');
        }
        else if (c == '\b')
        {
            putchar('\\');
            putchar('b');
        }
        else if (c == '\\')
        {
            putchar('\\');
            putchar('\\');
        }
        else if (c == '\r')
        {
            puts("\\n");
          //  putchar('\n');
        }
        else{
            putchar(c);
        }
    }
    return 0;
}

这是我的输入和输出: enter image description here 所以我在问:为什么我不能通过第一个^ Z来终止我的输入?否则说明为什么我必须输入enter来创建一个新行,以便通过输入^ Z来终止我的输入?

2 个答案:

答案 0 :(得分:2)

参见以下讨论:

在Unix上, Control-D (默认情况下)等同于Windows上的 Control-Z

所有人都指出,第一次键入 Control-Z 时,已经在输入中累积的输入被发送到程序(没有换行符);发送的字符数非零,因此还没有EOF。第二次,在行的开头键入 Control-Z ,程序获取零字节进行读取,这被解释为EOF。

答案 1 :(得分:1)

没有真正的理由超越&#34;它是如何运作的&#34;。你可以按 F6 。这将被视为发出文件结束信号,即使它没有输入

你必须按 F6 输入的原因相当简单:这里涉及两个独立的代码片段。操作系统有一个小的(有些瘫痪的)编辑例程,可以让您输入一行数据。它具有处理后退空间的代码以及类似的一些内容,因此您可以在输入数据时使用它们,即使您的代码根本不包含任何编辑功能。该例程会向您的程序返回一行文本,但当您输入已编程的内容时,&#34;想到&#34;作为一个完整的行 - 只有在按下 enter 时才会发生。

一旦操作系统读入了满载数据的缓冲区,它就会被发送到您的程序。你的程序查看内容,当它/如果找到 ctrl + Z 时,它会将其视为发出文件结尾的信号。但是,由于文件处理的结束是由您的程序完成的,而不是操作系统的编辑程序,因此在您按下后才能进行感知

如果您真的不喜欢这种行为,大多数操作系统确实提供了一些无缓冲读取的方法。确切的方式因操作系统而异。一个Windows,您可以使用_getch。大多数基于Unix的系统在Curses库中提供大致相同的功能(如果你想使用它,那么至少还有一个免费的Windows curses实现)。