據到this post的std :: COUT將上\n
自動沖水時它連接到交互設備(例如一個終端窗口)。否則(例如,當傳送到文件時),它將充分緩衝,並且只會沖洗.flush()
或std::endl
。我可以在「 n」上停止std :: cout刷新嗎?
有沒有一種方法來覆蓋在Microsoft Visual C這種行爲++,這樣我可以選擇我是否要完全緩衝或行緩衝模式?
據到this post的std :: COUT將上\n
自動沖水時它連接到交互設備(例如一個終端窗口)。否則(例如,當傳送到文件時),它將充分緩衝,並且只會沖洗.flush()
或std::endl
。我可以在「 n」上停止std :: cout刷新嗎?
有沒有一種方法來覆蓋在Microsoft Visual C這種行爲++,這樣我可以選擇我是否要完全緩衝或行緩衝模式?
這不是使用C的問題++(沒有語言要求那個\ n通過刷新任何東西),但與你的操作系統和/或控制檯軟件。如果控制檯想要在看到換行符時刷新其緩衝區,那麼它可以,而且我猜想大多數都是這樣做的。請注意,區分C++運行時的緩衝區(可以在某種程度上由您的C++代碼控制)和控制檯應用程序的緩衝區(無法控制它的緩衝區)很重要。
僅供參考,標準iostream庫中有一個標誌,名爲unitbuf如果設置,則會在每次輸出操作後刷新緩衝區。例如,它被設置爲std :: cerr流。這與'\ n'字符無關,因爲您可以在單個操作中輸出多個'\ n'。
一個實現可以在感覺合適時自由刷新。它不同供應商是否在\n
上衝洗。
我能看到的東西從我的C++ 0x草案要求ios_base& nounitbuf(ios_base& str);
。試一試。這是關於標準C++給你的唯一的東西。
相反,匿名的(04月28日'09)的答案,這種行爲無關與操作系統或「控制檯軟件」。
C++的<iostream>
流設計爲可與C的<stdio.h>
流進行互操作。目標是允許使用std::cout
與printf
/puts
的用途混合。爲了達到這個目的,std::cout
的streambuf
在C的stdout
流的頂部實現。它實際上是C的stdout
,當標準輸出連接到終端設備時,它是行緩衝的。
您可以調用std::ios_base::sync_with_stdio(false)
(在您的程序使用任何C++的標準I/O流之前)告訴C++流庫直接與底層文件描述符進行通信,而不是在C的流庫上進行分層。這完全避免了C的stdout
流,並以兩個不再混合的庫爲代價加速了C++的I/O流。
一種替代方法是無條件地設置stdout
通過調用std::setvbuf(stdout, nullptr, _IOFBF, BUFSIZ)
完全緩衝。然後,即使std::cout
仍在通過stdout
寫入,在每個換行符後面都不會有stdout
沖洗。
也許這可能是有用的,我懷疑它可以幫助你很多與你的問題,雖然。 http://nibuthomas.com/2009/02/12/writing-endl-like-functions-for-output-streams/ – Skurmedel 2009-04-28 09:16:25
看來,關於C++合併C90行緩衝的聲明的合法性似乎存在一些爭議vs std :: cout的完全緩衝區別。無論如何,有沒有辦法在使用MSVC的緩衝模式之間進行切換? – pauldoo 2009-04-28 16:05:00
也許你可以寫一個測試程序,看看索賠是否屬實? – Skurmedel 2009-04-29 11:03:23