web-dev-qa-db-ja.com

ファイルアクセスモード「w」と「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);
    }
8
Anh Minh Tran

絶対にanyfopen()関数の参照はこれを教えてくれます。たとえば、 manual page は、Unixライクな環境で使用される一般的なドキュメントです。

モード文字列には、文字「b」を最後の文字として、または上記の2文字の文字列の文字間の文字として含めることもできます。これは厳密にはC89との互換性のためであり、効果はありません。 Linuxを含むすべてのPOSIX準拠システムでは、「b」は無視されます。 (他のシステムはテキストファイルとバイナリファイルを異なる方法で処理する可能性があり、バイナリファイルにI/Oを行い、プログラムが非UNIX環境に移植されることが予想される場合、「b」を追加することをお勧めします。)

したがって、binaryを表し、ファイルの内容をテキストではないものとして扱うつもりであることを示すのに役立ちます。

あなたのコードにとって、バイナリアクセスは正しいようです。ただし、未加工のstruct値を直接書き込むことは、コンパイラで使用される正確な内部形式がわからず、予期せず変更される可能性があるため、一般的に非常に悪い考えです。 「後で」共有またはアクセスする必要があるファイルの場合、これはCで行う適切な方法ではありません。シリアル化を検討してください。

8
unwind

アクセスモードで"b"を指定すると、標準ライブラリ(の一部の実装)がファイルの読み取り/書き込み時に少数の文字を変換できなくなります。

ほとんどの一般的な翻訳は行末用です:Windowsでは\n\r\nに翻訳されます。

5
pmg

fopen documentation で:

上記のモード指定子を使用すると、ファイルはテキストファイルとして開かれます。ファイルをバイナリファイルとして開くには、モード文字列に「b」文字を含める必要があります。この追加の「b」文字は、文字列の末尾に追加できます(したがって、「rb」、「wb」、「ab」、「r + b」、「w + b」、「a + b ")または混合モードの文字と" + "記号の間に挿入する(" rb + "、" wb + "、" ab + ")。

3
Badda