2009-04-28 33 views
3

據到this post的std :: COUT將上\n自動沖水時它連接到交互設備(例如一個終端窗口)。否則(例如,當傳送到文件時),它將充分緩衝,並且只會沖洗.flush()std::endl我可以在「 n」上停止std :: cout刷新嗎?

有沒有一種方法來覆蓋在Microsoft Visual C這種行爲++,這樣我可以選擇我是否要完全緩衝或行緩衝模式?

+0

也許這可能是有用的,我懷疑它可以幫助你很多與你的問題,雖然。 http://nibuthomas.com/2009/02/12/writing-endl-like-functions-for-output-streams/ – Skurmedel 2009-04-28 09:16:25

+0

看來,關於C++合併C90行緩衝的聲明的合法性似乎存在一些爭議vs std :: cout的完全緩衝區別。無論如何,有沒有辦法在使用MSVC的緩衝模式之間進行切換? – pauldoo 2009-04-28 16:05:00

+0

也許你可以寫一個測試程序,看看索賠是否屬實? – Skurmedel 2009-04-29 11:03:23

回答

1

這不是使用C的問題++(沒有語言要求那個\ n通過刷新任何東西),但與你的操作系統和/或控制檯軟件。如果控制檯想要在看到換行符時刷新其緩衝區,那麼它可以,而且我猜想大多數都是這樣做的。請注意,區分C++運行時的緩衝區(可以在某種程度上由您的C++代碼控制)和控制檯應用程序的緩衝區(無法控制它的緩衝區)很重要。

僅供參考,標準iostream庫中有一個標誌,名爲unitbuf如果設置,則會在每次輸出操作後刷新緩衝區。例如,它被設置爲std :: cerr流。這與'\ n'字符無關,因爲您可以在單個操作中輸出多個'\ n'。

0

一個實現可以在感覺合適時自由刷新。它不同供應商是否在\n上衝洗。

我能看到的東西從我的C++ 0x草案要求ios_base& nounitbuf(ios_base& str);。試一試。這是關於標準C++給你的唯一的東西。

7

相反,匿名的(04月28日'09)的答案,這種行爲無關與操作系統或「控制檯軟件」。

C++的<iostream>流設計爲可與C的<stdio.h>流進行互操作。目標是允許使用std::coutprintf/puts的用途混合。爲了達到這個目的,std::coutstreambuf在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沖洗。