簡體   English   中英

文件訪問模式“w”和“wb”的區別

[英]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.

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