标准输入的EOF以标准输出

时间:2015-09-23 10:36:05

标签: c macos unix

我正在做一些测试,从标准输入读取和在标准输出中写入,有些事情真的困扰我。

当我尝试写一个单个字符后跟一个\ n时, EOF (我推测)中的“D”在字符后面打印。

以下是终端中发生的事情:

 >./myprog
 sometext I enter
 "Ctrl + D"
 jD
 j
 >

这是代码:

#define BUF_SIZE 4096

void    read_std_in()
{
    int     ret;
    char    buf[BUF_SIZE + 1];

    while ((ret = read(0, buf, BUF_SIZE)))
    {
        buf[ret] = '\0';
        // Concatenating buffer with some other string, not important here.
    }
    write(1, "j", 1);
    write(1, "\n", 1);
    write(1, "j", 1);
    write(1, "\n", 1);
}

正如你所看到的,第一个“j”从无处获得“D”。

如果我尝试为forst行显示多个字符,则不会出现问题:

 >./myprog
 sometext I enter
 "Ctrl + D"
 jj
 j
 >

如果我没有放任何字符(只是\ n)我得到:

 >./myprog
 sometext I enter
 "Ctrl + D"
 ^D
 j
 >

如何避免此行为?

1 个答案:

答案 0 :(得分:5)

我在OS X / Darwin中遇到了相同的行为。

当您点击 Ctrl D 但是没有推进文本光标时,看起来^D正在回显到控制台。因此,第一个j被放置在^字符的顶部。 (您可以通过将第一个write(1, "j", 1);更改为write(1, "\33[2Cj", 5);来验证这一点,这会在打印j之前将光标向右移动两个位置。)

我认为没有任何简单的方法可以阻止^D出现,所以你可以忽略它。 D未添加到您的输入中,因此不会导致软件操作出现任何问题。

或者,如果您将输入传递给程序,那么问题就会消失:

./myprog <<<"some text"