2014-01-28 61 views

回答

0

這取決於你在做什麼。例如,如果您使用控制檯警告用戶有關漫長的過程......在同一行中打印一系列點......沖洗可能很有趣。對於正常輸出,每行一行,你不應該關心沖洗。

因此,對於基於字符的輸出或非基於行的控制檯輸出,可能需要刷新。對於基於行的輸出,它按預期工作。

這對方的回答可以澄清你的問題的基礎上,爲什麼避免ENDL和手動沖洗可以出於性能的考慮好: mixing cout and printf for faster output

關於什麼是沖洗:當你寫一個緩衝流,像ostream的,你不能保證你的數據到達目標設備(控制檯,文件等)。發生這種情況是因爲流可以使用中間緩衝區來保存數據並且不會停止程序。通常,如果緩衝區足夠大,它們將保存所有數據,並且由於I/O設備速度較慢,所以不會停止程序。您可能已經注意到控制檯非常慢。刷新操作告訴流,你想確保所有的中間數據到達目標設備,或至少他們的緩衝區現在是空的。這對於日誌文件非常重要,例如,您希望確保(不是100%)行將位於磁盤上,而不是位於某個緩衝區中。如果你的程序不能丟失數據,這變得更加重要,也就是說,如果它崩潰了,你想確保你最好把你的數據寫在磁盤上。對於其他應用程序,性能更爲重要,例如,您可以讓操作系統決定何時爲您刷新緩衝區,或者等到關閉流之後再進行。

2

Flushing強制輸出流寫入任何緩衝字符。 Read streamed input/output.

這取決於您的應用程序,在實時或交互式應用程序中,您需要立即刷新它們,但在很多情況下,您可以等到關閉文件並讓程序自動刷新它。

0

由於性能原因,I/O庫緩衝區發送到流的數據。無論何時您需要確保數據實際上已經發送到流,您需要刷新它(否則它可能仍然在緩衝區中,並且在屏幕上或文件中不可見)。

某些操作會自動刷新流,但您也可以顯式調用類似ostream :: flush的內容。

無論何時例如您有其他程序正在等待來自第一個程序的輸入,您都需要確保數據被刷新。

2

何時必須刷新C++中的輸出流?

如果您想確保寫入到其中的數據對其他程序或(在文件流的情況下)可見的其他流讀取與此相同的文件,並且即使程序異常終止,也要確保寫入輸出。因此,在冗長的計算之前打印消息或打印消息以表明出現問題時(儘管通常會使用cerr,因爲該消息會在每次輸出後自動刷新),您會希望這樣做。

有通常不需要衝洗cerr(其中,默認情況下,具有其unitbuf標誌設置每個輸出後刷新),或從cin讀取之前沖洗cout(這些流被捆綁以便cout被讀取之前,自動沖洗cin)。

如果程序的目的是產生大量的輸出,要麼到cout要麼到文件,然後不要在每行之後刷新 - 這可能會顯着減慢它的速度。

什麼是沖洗?

輸出流包含內存緩衝區,通常寫入速度比底層輸出快得多。輸出操作將數據放入緩衝區;沖洗將其發送到最終輸出。

1

如果您正在編寫一個頻繁出現空間的大文件,刷新會是災難性的。

例如

for(int i = 0 ;i < LARGENUMBER;i++) 
{//Slow? 
    auto point = xyz[i]; 
    cout<< point.x <<",",point.y<<endl; 
} 

VS

for(int i = 0 ;i < LARGENUMBER;i++) 
{//faster 
    auto point = xyz[i]; 
    cout<< point.x <<",",point.y<<"\n"; 
} 

VS

for(int i = 0 ;i < LARGENUMBER;i++) 
{//fastest? 
    auto point = xyz[i]; 
    printf("%i,%i\n",point.x,point.y); 
} 

endl()往往知道做其他事情,例如在所謂的調試模式同步線程在MSVC上,導致出現與預期相反的多線程程序,它將uni打印出來來自不同線程的中斷短語。

1

首先,你看錯了。無論您使用std::endl'\n' 在很大程度上取決於上下文,但在有疑問時,std::endl是 的正常默認值。使用'\n'保留給您事先知道沖洗不是必需的情況,並且它會太昂貴。

沖洗涉及緩衝。當您向 寫入數據流時,(通常)數據不會立即寫入 系統;它被簡單地複製到一個緩衝區中,當緩衝區滿時,或者文件關閉時將被寫入 。或者當明確刷新時,它是 。這是出於性能原因:系統 調用通常是一個相當昂貴的操作,並且它通常是 不是一個好主意,爲每個字符。歷史上, C有一些稱爲線路緩衝模式,每'\n'與 刷新,事實證明,這是一個很好的妥協 大多數事情。由於各種技術原因,C++沒有 有它;使用std::endl是C++實現同樣 結果的方法。

我的建議是隻使用std::endl,直到你的 開始出現性能問題。如果沒有其他的話,它使得 調試更簡單。如果你想進一步,這是有道理的, 使用'\n'當你輸出一系列行只在 幾個語句。還有一些特殊情況,如日誌記錄, ,您可能想要明確控制沖洗。