C++命令无序执行

Som*_*dom 6 c++ operator-precedence

我试图制作一个简单的shell程序,看一些例子已经看到大多数人使用getline()来获取输入,但是我一直在尝试使用read()并注意到一个奇怪的错误,我想知道是否其他人们看到或知道原因.

当我使用getline运行代码时,一切正常.运行程序后,我会显示终端名称,并准备好接受输入.当我使用read时,它似乎是在接受输入后执行shell的名称.无论我做什么,这似乎都会发生.显示shell名称的行是

cout << "SweetShell-> ";
Run Code Online (Sandbox Code Playgroud)

然后在这一行之后我运行read命令,或者甚至调用另一个进程然后运行read命令,并且在输入之后打印"SweetShell->".

即使在测试期间我也有一块代码,如:

cout << "SweetShell-> ";
int test = read(0,buf,MAX_ARGS);
//temp is a string that is set to the input
cout << temp << "    " << test;
Run Code Online (Sandbox Code Playgroud)

输出看起来像这样:

    3SweetShell-> ls
Run Code Online (Sandbox Code Playgroud)

意思是它打印空格,然后测试,然后是第一个cout,最后是temp.任何人都知道这是怎么回事?

Set*_*son 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;
Run Code Online (Sandbox Code Playgroud)


sar*_*old 5

因为输出是缓冲的,所以在尝试输入flush之前您需要先输出。read()

顺便说一句,将原始操作系统级别read(2)write(2)操作与缓冲 IO 操作相结合时要小心;虽然您当然可以在同一个程序中使用它们,但在同一个文件套接字上使用它们会带来麻烦;因此,坚持使用一种形式将减少将来引入缺陷的可能性。