标准输入的EOF以标准输出显示

rea*_*404 2 c unix macos

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

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

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

 >./myprog
 sometext I enter
 "Ctrl + D"
 jD
 j
 >
Run Code Online (Sandbox Code Playgroud)

这是代码:

#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);
}
Run Code Online (Sandbox Code Playgroud)

如你所见,第一个"j"从无处获得"D".

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

 >./myprog
 sometext I enter
 "Ctrl + D"
 jj
 j
 >
Run Code Online (Sandbox Code Playgroud)

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

 >./myprog
 sometext I enter
 "Ctrl + D"
 ^D
 j
 >
Run Code Online (Sandbox Code Playgroud)

我该如何避免这种行为?

squ*_*age 5

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

^D当你点击时CtrlD,它看起来像是在回显到控制台,但没有推进文本光标.结果,第一个j被置于^角色的顶部.(您可以通过更改第一个write(1, "j", 1);来验证这一点,write(1, "\33[2Cj", 5);在打印前将光标向右移动两个位置j.)

我认为没有任何简单的方法可以防止^D出现,所以你可以忽略它.在D不添加到您的输入,这样就不会导致您的软件的任何操作问题.

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

./myprog <<<"some text"
Run Code Online (Sandbox Code Playgroud)