web-dev-qa-db-ja.com

fopenのrとrbの違いは何ですか

Cでfopenを使用してみました。2番目のパラメーターはオープンモードです。 2つのモード「r」と「rb」は、私をよく混乱させる傾向があります。それらは同じようです。ただし、「rb」を使用した方がよい場合もあります。それでは、なぜ「r」が存在するのでしょうか?詳細または例を挙げて説明してください。ありがとうございました。

54
Shaobo Wang

テキストファイルを開くには、"r"を使用する必要があります。オペレーティングシステムごとにテキストの保存方法が少し異なるため、これにより正しい翻訳が実行されるため、ローカルオペレーティングシステムの特異性について知る必要がありません。たとえば、コードの実行場所に関係なく、改行は常に単純な"\n"として表示されることがわかります。

非テキストファイルを開く場合は、"rb"を使用する必要があります。この場合、翻訳が適切ではないためです。

68
caf

LinuxおよびUnix全般では、_"r"_と_"rb"_は同じです。より具体的には、テキストモードおよびバイナリモードでファイルをfopen() ingすることによって取得されるFILEポインターは、Unix上で同じように動作します。 Windows、および一般的に、複数の文字を使用して「 newlines 」を表すシステムでは、テキストモードで開かれたファイルは、それらの文字がすべて1文字であるかのように動作します_'\n'_ 。

任意のシステムでテキストファイルを移植可能に読み書きする場合は、fopen()で_"r"_と_"w"_を使用します。これにより、ファイルが適切に書き込まれ、読み取られることが保証されます。バイナリファイルを開く場合は、_"rb"_および_"wb"_を使用して、残念な改行変換がデータを混乱させないようにしてください。

基礎となるシステムが改行変換を行う結果は、 fseek(file、0、SEEK_END) を使用してファイルから読み取ることができるバイト数を決定できないことに注意してください。

最後に、 テキストとバイナリI/Oの違いは? on comp.lang.c FAQs を参照してください。

28
Alok Singhal

「rb」を使用してバイナリファイルを開きます。次に、ファイルのバイトを読み取るときにエンコードされません

8
sagie
  • 「r」は、 変換モード の「rt」と同じです。
  • 「rb」は非翻訳モードです。

これにより、少なくともWindowsで違いが生じます。詳細については、そのリンクを参照してください。

7
Alex Budovski

ほとんどのPOSIXシステムでは、無視されます。ただし、システムを確認してください。

XNU

モード文字列には、文字「b」を最後の文字として、または上記の2文字の文字列の文字間の文字として含めることもできます。これは、厳密にはISO/IEC 9899:1990( 'ISO C90')との互換性のためであり、効果はありません。 「b」は無視されます。

Linux

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

2
nathansizemore