2014-01-29 162 views
5

我知道那里有很多关于此的主题,但他们都没有帮助我。Eclipse C++控制台打印命令linux

我用我的C/C++项目std::coutstd::cerr来打印信息(cout)或错误(cerr)。 但是,执行它时,他们不按正确的顺序打印,他们似乎“组打印”。有时候所有的机器人都会接受,所有的机器人都会先接受所有的机器人。我试过flush()之后每行都行不通。 (幸运的是,每次都使用它会很糟糕...)。 也试过setvbuf(stdout, NULL, _IONBF, 0);同样的问题...

如果直接在linux的控制台上运行程序,顺序是好的,但由于颜色,eclipse控制台更有用。

下面的代码示例

#include <iostream> 

int main(int argc, char** argv) 
{ 
    std::cerr << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cout << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cerr << __LINE__ << std::endl; 
    std::cout << __LINE__ << std::endl; 
} 

和控制台打印

11 
12 
14 
15 
13 
16 

==>错误的顺序... 在这个例子中CERR出来之前,COUT

+4

这很可能是eclipse的一个问题。 'std :: endl'实际上会导致一个'flush()'FYI – Avery3R

+0

为什么你期望,打印到两个不同流的文本有一个定义的序列,它将出现?没有保证,它在控制台上工作可能是一个实现细节。为什么不把它打印到同一个流中,并在前缀“Info:”和“Error:”之类的东西上,那么它就能保证工作。 –

+0

我也会尝试为每个调用使用锁(互斥锁)并查看它的行为。 – Mercury

回答

0

好的情况是如下所示,std::cout被添加到buffor中,并且std::cerr不会。 std::cerr更快,并且不需要刷新。另外std::cerrstd::cout使用不同的流。

这里的问题是std::cerr马上显示,std:cout需要刷新才显示。

+0

'std :: endl'刷新流,所以行号应始终按顺序打印。 – gurka