我正在尝试制作一个简单的shell程序,看一些例子已经看到大多数人使用getline()来获取输入,但是我一直在尝试使用read()并注意到一个奇怪的错误,我是想知道其他人是否看到或知道原因。
当我使用getline运行代码时,一切正常。运行程序后,我显示终端名称,它已准备好接受输入。当我使用read时,它似乎是在接受输入后执行shell的名称。无论我做什么,这似乎都会发生。显示shell名称的行是
cout << "SweetShell-> ";
然后在此行之后我运行read命令,或者甚至调用另一个进程然后运行read命令,并且在输入之后打印“SweetShell-&gt;”的任何一种方式。
即使在测试期间,我也有一段代码,如:
cout << "SweetShell-> ";
int test = read(0,buf,MAX_ARGS);
//temp is a string that is set to the input
cout << temp << " " << test;
输出看起来像这样:
3SweetShell-> ls
意思是它打印空格,然后测试,然后是第一个cout,最后是temp。任何人都知道这是怎么回事?
答案 0 :(得分:11)
您应该尝试“刷新”输出缓冲区以确保按顺序打印。尝试:
cout << "SweetShell-> " << std::flush;
int test = read(0,buf,MAX_ARGS);
//temp is a string that is set to the input
cout << temp << " " << test << std::flush;
答案 1 :(得分:4)
由于输出是缓冲的,因此在尝试read()
输入之前,您需要flush
输出。
顺便提一下,在将原始操作系统级read(2)
和write(2)
操作与缓冲IO操作组合时要小心;虽然你当然可以在同一个程序中使用它们,但是在同一个文件或 socket 上使用它们会造成麻烦;所以坚持使用一种形式或另一种形式将减少将来引入缺陷的可能性。
答案 2 :(得分:4)
关键是std::cout
和std::cin
绑定(请参阅http://www.cplusplus.com/reference/iostream/ios/tie/) - 这意味着std::cin
上的流媒体操作将首先触发std::cout
上的同花。但是,您正在使用完全绕过C ++流库的libC read(...)
函数,因此不可能调用flush。您可以改为使用std::cin.read()
。
答案 3 :(得分:0)
为什么不使用cin >> test
?我总是使用<iostream>
函数进行控制台I / O;他们的工作非常好。