簡體   English   中英

為什么fwrite()在Mac OS X上使用C中的“wb”寫入二進制文件?

[英]Why doesn't fwrite() write a Binary File using “wb”, in C, on Mac OS X?

為了學習C並理解二進制文件和文本文件之間的區別,我試圖將一個字符串寫入文件,因為兩種文件類型都是這樣的:

char * string = "I am a string!";

FILE * filePtrA = fopen("/output.txt", "wt");
fwrite(string, strlen(string), 1, filePtrA);

FILE * filePtrB = fopen("/output.bin", "wb");
fwrite(string, strlen(string), 1, filePtrB);

fclose(filePtrA);
fclose(filePtrB);

然而, "wt""wb"都寫為文本文件,其中"wb"應該寫為二進制文件。 Hex對於這兩個文件都是這樣的:

49 20 61 6D 20 61 20 73 74 72 69 6E 67 21

為什么會發生這種情況,如何將內容寫為二進制文件?

我已經讀過操作系統(Mac OS X 10.6 - GCC 4.2)可能無法區分二進制文件和文本文件,但我仍然難以理解為什么十六進制編輯器不會發現任何差異。

所有文件都是二進制的

fopen上下文中“文本文件”和“二進制文件”之間的區別在於標准庫在文本模式下可以使用過濾器來讀取和寫入文件。 在二進制模式下,你寫的東西總是寫的。

我所知道的唯一實際例子是在Windows中,在文本模式下打開文件將使它在Windows風格的行結尾(CRLF, "\\r\\n" )和C風格/ Unix風格的行結尾之間進行轉換( LF, "\\n" )。 例如,當您在文本模式下打開用於在Windows中讀取的文件時,行結尾將在程序中顯示為"\\n" 如果要以二進制模式打開它,行結尾將在程序中顯示為"\\r\\n"


您還可以使用cat檢查文件,例如:

文件名

你應該得到輸出: I am a string!

兩個文件都是二進制文件。 它們是您發送給fwrite的數據的精確副本。 一些損壞的操作系統有不是二進制的文本文件; 他們有額外的垃圾,如\\r\\n替換\\n ,或固定大小的行記錄等.POSIX禁止所有這些。 在任何POSIX OS上,文本和二進制模式都是相同的。

順便說一句, "wt"不是fopen的有效模式參數。 文本模式是默認的。 請求文本模式的t修飾符是破壞的Windows實現的擴展,其中二進制是默認的,但文本模式可通過請求獲得。

唯一不同的文本模式使其成為行結尾。 所以,如果你fprintf一個\\n它將根據平台進行翻譯。 對於您的示例,二進制或文本模式與寫入文件的內容沒有區別。

在大多數類Unix系統上,在文本和二進制模式下打開文件沒有區別。 此外,你在上面寫數據無法顯示,甚至上對待“文本”和“二進制”文件不同的許多系統的差異。

例如,在Windows上以文本模式打開文件通常意味着您編寫的“\\ n”將在實際文件中轉換為“\\ r \\ n”(並且在讀取期間完成相反的操作)。 由於您沒有寫“\\ n”,因此不會發生這種翻譯。

你是對的。 這在類Unix系統上無關緊要。 來自cygwin陣營的討論 你期望看到什么區別? 您正在將ASCII文本寫入文件,而不是任意二進制數據。

像操作系統這樣的Unix將兩者視為相同。 我不確定這是正確的答案,但是如果你想將文本作為十六進制文件放入文件中,嘗試在text.eg之前應用\\ x如果你試圖將hello寫入文件,那么你的緩沖區就是是:
char * buf =“你好”;
如果你想在文件中寫入“hello”的十六進制,你的緩沖區應該是這樣的
char * buff =“\\ x68 \\ x65 \\ x6c \\ x6c \\ x6f”;
希望它有所幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM