2014-09-13 42 views
4

如果我以文本模式而不是二進制模式打開文件,是否有區別?因爲我讀過UNIX和Linux沒有區分文本和二進制文件。文件訪問中的文本和二進制模式有什麼區別嗎?

+3

對於unix沒有區別。 (文本與二進制文件僅僅是一個微軟製品) – wildplasser 2014-09-13 12:39:50

+1

不僅僅是,AFAIK它是在C99標準規範中。 – 2014-09-13 12:40:24

+2

並非所有的「文本」文件*都會在CR/LF轉換時被正確讀取;只有那些以ASCII編碼的(或緊密派生或擴展)將會是。可以說,EBCDIC中編碼文本的文件是「文本文件」,所以這至少需要對使用的編碼進行一些定義。此外,CR/LF轉換可能會混淆16位Unicode文本文件。人們可以說一個單獨的「文本模式」已經被有效地廢棄了。 – usr2564301 2014-09-13 13:19:51

回答

4

Linux上沒有什麼區別(至少在像Ext4這樣的本地文件系統上,在大多數其他文件系統上也是如此,用通常的GNU libc)。

也許一些奇怪的文件系統可能有一個特定的標誌來打開不同的二進制或文本文件。我不知道這樣的文件系統。也許你可以編寫一些FUSE文件系統做的區別,或許與一些額外的黑客周圍fopen內離奇定製的libc

然而,C99 standard(至少第271頁,n1256草案§7.19.5.3)提到明確的文字VS二進制模式,因此如果符合標準,您的程序將更容易移植到其他系統(如Windows)。

所以我的意思是,你可能想嘗試傳遞一個模式字符串到fopen區分二進制文本模式。 (我同意我不經常這樣做)。它不會受傷。

Linux的fopen(3)手冊頁明確地說:

模式字符串也可以包括字母「b」無論是作爲最後的 字符或在任何兩 字符的字符之間的字符上述字符串。這是嚴格爲 與C89兼容,並沒有影響;所有 符合POSIX標準的系統(包括Linux)都會忽略'b'。 (其他系統可能會以不同的方式處理 文本文件和二進制文件,如果您對二進制文件執行I/O操作,並且希望程序 可能會移植到非UNIX環境,那麼添加'b'可能會是一個好主意。 )

當然,open(2)系統調用沒有任何方式傳輸模式標誌。 (你需要一些私有ioctl(2)大概)

+2

這裏的文件系統不相關。 FS使用塊。翻譯/解釋CR/LF(如果有的話)在libc級別完成。 (getc,fgets,fread,fseek(!)ftell(!),...) – wildplasser 2014-09-13 13:08:11

+0

原則上你是對的,但我想有些FUSE文件系統可能會有不同的做法,例如將'\ r \ n'轉換爲'\ n' ....! – 2014-09-13 13:08:44

+0

我不知道FUSE文件系統。 [不要以爲我想要。 *用火殺死它...... *] – wildplasser 2014-09-13 13:12:50

相關問題