C++ C++;命令执行不正常

C++ C++;命令执行不正常,c++,operator-precedence,C++,Operator Precedence,我正在尝试制作一个简单的shell程序,看看几个例子,大多数人都使用getline()获取输入,但是我一直在尝试使用read()并注意到一个奇怪的bug,我想知道其他人是否看到或知道它的原因 当我使用getline运行代码时,一切正常。运行程序后,我会显示终端名称,它可以接受输入。当我使用read时,它似乎在接受输入后执行shell的名称。无论我做什么,这似乎都会发生。显示外壳程序名称的行是 cout << "SweetShell-> "; 这意味着它先打印空格,然后测试,然

我正在尝试制作一个简单的shell程序,看看几个例子,大多数人都使用getline()获取输入,但是我一直在尝试使用read()并注意到一个奇怪的bug,我想知道其他人是否看到或知道它的原因

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

cout << "SweetShell-> ";
这意味着它先打印空格,然后测试,然后第一个cout,最后是temp。有人知道这是怎么回事吗?

您应该尝试“刷新”输出缓冲区,以确保它按顺序打印。尝试:

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;

cout因为输出是缓冲的,所以在尝试读取输入之前需要先读取输出


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

关键是
std::cout
std::cin
是绑定的(请参阅)-这意味着
std::cin
上的流式操作将首先触发
std::cout
上的刷新。但是,您使用的是LBC<代码> Read(…)< /C>函数,它完全绕过C++流库,因此没有调用刷新的机会。您可以使用
std::cin.read()

为什么不使用
cin>>测试?我总是使用
功能进行控制台I/O;它们工作得很好。

谢谢快速的响应,这似乎完全固定了,我对C++有点陌生,所以我不知道你需要这样冲洗它。通常这是不必要的,但是
flush
保证您发送到流的内容(无论是通过
cout
在终端显示中还是发送到文件中)将被打印/写入。如果在刷新缓冲区之前,某个中间函数将缓冲区的目标弄乱(即打印到终端),就像
read
一样,您可能会遇到问题。@Seth:“这取决于”不准确(详细信息见我的答案)。@Tony:我不是说“魔法”定义了这种情况。我只是不能在一篇评论文章中列举所有的情况。例如,您的回答错过了
系统(“echo hello there”)的异常呼叫
@Seth:what's
系统(“echo hello here”)有什么关系吗?它不会刷新<代码> STD::CUT…谢谢将来的提示,以后会记住这一点。顺便说一下,我的答案是:C++保证这些命令将按顺序执行(因此你的标题应该被修改);它只是不能保证输出是您所期望的。这是在哪个操作系统上运行的?根据你的问题,可以假设它是Mac、Windows、Linux等。事实上,我认为为了更好地理解这种行为,你应该确切地告诉我们什么是
temp
,以及该注释将取代什么(如果有的话)。操作系统是Linux,至于temp到底是什么,它是一个字符串。注释出来的是一个7-8行块,它将字符串切分为标记,检查某些标记是否等于特定字符,然后创建一个向量来保存切分的字符串。我认为这是不相关的,因为没有任何操作实际上修改了temp或处理了输入/输出,所以我没有包含它们。谢谢,我从来没有这样想过。虽然一般来说我更喜欢iostreams,但它们与C I/O函数相比真的很慢。所以,当有很多IO时,我会切换到printf、scanf等。
    3SweetShell-> ls
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;