2014-04-16 86 views
8

有沒有辦法將stdout設置爲二進制模式?在哪種模式下stdout沒有任何操作,從我的調試問題,我認爲它是文本模式,這是真的嗎?有沒有辦法將stdout設置爲二進制模式?

我試圖函數:

freopen(NULL,"wb",stdout)

,但我的計劃是崩潰,當我這樣做。

+1

爲什麼? 'stdout'應該與文本終端兼容。根據當前語言環境獲取文本語義。 (請注意,C和C++有不同的語言環境系統,並且您需要採取積極措施使庫語言環境與操作系統語言環境匹配。) – Potatoswatter

+0

如果您需要'二進制模式'省略格式化輸出 - 堅持未格式化輸出 –

+0

出於何種目的?聽起來像個壞主意...... – tenfour

回答

10

我嘗試下面的代碼提交給設置stdin和stdout爲二進制模式(在Windows上):

#ifdef _WIN32 
    #include <io.h> 
    #include <fcntl.h> 
#endif 
... 
#ifdef _WIN32 
    setmode(fileno(stdout),O_BINARY); 
    setmode(fileno(stdin),O_BINARY); 
#endif 

在Linux下你不能這樣做,因爲在這個平臺上的二進制和文本模式是一樣的東西。

+0

這可以工作。你可以通過做 fwrite(「a \ nb」,1,3,stdout)來測試它。 如果生成的文件是3個字節,則stdout是二進制的。如果沒有上面的setmode()調用,你最終會得到一個4字節的文件。 –

0

簡單的答案是否定的。該模式在iostream對象被構建時確定,並且以後不能更改。有些實現可能會提供稍後執行的手段,但這不是標準化的。在一些實現中,在stdout上執行freopen可能會改變模式,儘管我認爲這是正式的,但這在C++中是被禁止的。 (它是在C中定義的實現)顯然,它不適用於你的實現。

你最好打賭是找出你的系統如何命名控制檯設備(Unix下的"/dev/tty";我認爲在Windows下),打開它以所需的模式輸出。

+1

只需'CON'而不是'CONS',但這不可能有所幫助 - 在需要二進制輸出的情況下,所述輸出不太可能會轉到控制檯。你可能甚至不會擁有一個控制檯。 (最典型的場景是一個CGI腳本,例如,爲Web服務器動態生成JPEG。) –

相關問題