簡體   English   中英

`fgetc`,`fputc`,`fgets`和`fputs`是否需要在文本模式下打開文件,`fread`和`fwrite`需要二進制模式的文件?

[英]Do `fgetc`, `fputc`, `fgets` and `fputs` require a file opened in text mode, and `fread` and `fwrite` require a file in binary mode?

當為文件使用fgetcfputcfgetsfputs ,我是否需要確保在文本模式下open文件而不是二進制模式?

使用freadfwrite ,是否需要以二進制模式而不是文本模式open文件?

在Linux中,我猜沒有區別。 但是如果在Windows中我目前無法訪問該怎么辦?

[使用mingw在windows下嘗試編輯]

文本和二進制模式之間的區別僅存在於Windows下,不僅涉及fwritefread ,還涉及fgetc / fputc /.../ _read / _write

在文本模式下,如果文件包含序列\\ r \\ n,則只有在讀取時才會獲得\\ n,如果文件不包含\\ r \\ n。 在二進制模式下,返回兩個字符。 注意fread Microsoft Docs_read Microsoft Docs談論這個案例,但遺憾的是fget中沒有任何關於fgetc說法fgetwc Microsoft Docs

寫入時如果在文本模式下打開流,則每個\\ n都被寫為\\ r \\ n對。 請注意,替換對fwrite返回的大小沒有影響。 在二進制模式下\\ n未寫入,沒有添加\\ r \\ n。 注意fwrite Microsoft Docs_write Microsoft Docs談論這個案例,但遺憾的是fputc fputwc中沒有任何關於fputc說法Microsoft Docs

幸運的是,在Windows下的文本模式下,讀寫函數是對稱的,當你在文本模式下寫入foo \\ nbar然后你仍然在文本模式下讀取生成的文件你得到foo \\ nbar,但是文件中有foo \\ r \\ nbar。

所以

當為文件使用fgetc,fputc,fgets和fput時,我是否需要確保以文本模式而不是二進制模式打開文件?

該模式有影響

使用fread和fwrite時,是否需要以二進制模式而不是文本模式打開文件?

與其他功能一樣,它是您的選擇,但如果文件也是由其他工具讀/寫,則最好以文本模式打開,以防這些工具在讀取或生成時在\\ n之前期望\\ r \\ n寫作時配對。 當然你也可以在二進制模式下打開並自己在\\ n之前顯式地寫一個\\ r \\ n。

如果該文件僅供您使用C進行讀/寫,則最好始終以二進制模式打開,以使文件中只包含您明確要求的文件。 如果您使用ftell / fseek,則會強制執行此操作。

ftell中所述, Microsoft Docs ftell和_ftelli64可能無法反映在文本模式下打開的流的物理字節偏移量,因為文本模式會導致回車換行。

關於fseek ,這是最糟糕的,正如fseek微軟Docs所說:

對於在文本模式下打開的流,fseek和_fseeki64使用有限,因為回車換行翻譯可能導致fseek和_fseeki64產生意外結果。 保證在文本模式下打開的流上運行的唯一fseek和_fseeki64操作是:

  • 尋找相對於任何原點值的偏移量為0。

  • 在使用_fseeki64時,在使用fseek或_ftelli64時,從文件調用返回的偏移值中查找文件的開頭。

不是。 所有 stdio輸入和輸出函數都是根據對fgetcfputc的重復調用來定義的。 除了頂部的POSIX要求(主要是鎖定整個較大的操作而不是單獨的fgetc / fputc粒度),自己在循環中調用fputcfgetc或者使用fwritefread執行等效操作之間沒有區別。

如果您使用的C實現以不同於二進制的方式處理文本文件,則無論您使用哪些函數執行操作,該處理都適用。

暫無
暫無

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

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