[英]The difference in File access mode "w" and "wb
這些代碼塊之間有什么不同。 我試圖搜索“wb”,但沒有在任何地方看到它。 包含“wb”的文件來自我的一位導師
FILE *f = fopen(DB_FILE_NAME, "wb");
if (f == NULL) {
printf("Write error\n");
} else {
/* write n_students elements of the studentlist array */
fwrite(studentlist, sizeof(student_t), n_students, f);
fclose(f);
}
和
FILE *f = fopen(DB_FILE_NAME, "w");
if (f == NULL) {
printf("Write error\n");
} else {
/* write n_students elements of the studentlist array */
fwrite(studentlist, sizeof(student_t), n_students, f);
fclose(f);
}
在訪問模式中指定"b"
可防止標准庫(的某些實現)在讀取/寫入文件時轉換幾個字符。
最常見的翻譯是行尾: \n
\r\n
。
絕對任何關於fopen()
函數的參考都會告訴你這一點。 例如,手冊頁是類 Unix 環境中使用的常用文檔:
模式字符串還可以包括字母“b”作為最后一個字符或作為上述任何雙字符字符串中字符之間的字符。 這只是為了與 C89 兼容,沒有任何效果; 'b' 在所有符合 POSIX 的系統(包括 Linux)上都被忽略。 (其他系統可能會以不同方式處理文本文件和二進制文件,如果您對二進制文件執行 I/O 操作並希望您的程序可以移植到非 UNIX 環境,那么添加 'b' 可能是個好主意。)
因此,它代表二進制,用於指示您打算將文件的內容視為非文本。
對於您的代碼,二進制訪問似乎是正確的。 但是,直接編寫原始struct
值通常是一個非常糟糕的主意,因為您不知道編譯器使用的確切內部格式並且它可能會意外更改。 對於應該“稍后”共享和/或訪問的文件,這不是在 C 中執行此操作的正確方法。查看序列化。
在fopen 文檔中:
使用上面的模式說明符,文件將作為文本文件打開。 為了將文件作為二進制文件打開,“b”字符必須包含在模式字符串中。 這個額外的“b”字符可以附加在字符串的末尾(從而產生以下復合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a +b") 或插入字母和混合模式的“+”符號之間(“rb+”、“wb+”、“ab+”)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.