C ++命令无序执行

时间:2011-04-04 01:29:08

标签: c++ operator-precedence

我正在尝试制作一个简单的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。任何人都知道这是怎么回事?

4 个答案:

答案 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::coutstd::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;他们的工作非常好。