2014-01-29 160 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