

バイナリモードとテキストモードはどのように使い分けますか  
どのような違いがありますか

<http://www7b.biglobe.ne.jp/~robe/cpphtml/> この説明で納得できませんでした。


CC BY-SA 3.0
2015-08-01T20:43:36.323
12930
2015-08-01T21:21:11.557
2015-08-01T21:16:13.177
4236
10758
question
c
バイナリモードとテキストモードの使い分け


テキストモードをどう定義するかはOS依存です。例えばUNIXの場合テキストモードはバイナリモードと同じとされるため特にモードの切り替えを必要としていません。  
Windowsのテキストモードの場合、ファイルに保存する際に改行コードを `\r\n`（CR LF）の２バイトを使って表現します。しかしCプログラム上では
`\n`（NL）の１バイトを使うために読み書きを行う際に変換が必要になります。この変換は

[code]

    FILE* fp;
    fprintf(fp, "\n");    // "\r\n"に変換される
    
[/code]

のように行指向の分かりやすいものだけでなく、`fread`や`fwrite`といったバイナリを扱う関数においても機械的に変換されます。


CC BY-SA 3.0
2015-08-01T21:14:51.320
12931
2015-08-01T21:14:51.320
4236
12930
answer


バイナリモードとは読み書きしたいファイルに書いてある内容を１バイトたりとも変更せずに取り扱いたい場合に使い、  
テキストモードとはソースコードを異プラットフォームで共通に使いたい場合に使います。

プラットフォーム（実行処理系）にとって適切な「テキストファイル中の改行コード」は異なります。  
[改行の、\nと\r\nの違いは何ですか？](https://ja.stackoverflow.com/questions/12897/)  
テキストモードを使うと、この「適切な改行コード」が自動的に選ばれます。  
テキストモードでは [c](/questions/tagged/c "'c' のタグが付いた質問を表示") ソース中の `\n`
記述と「適切な改行コード」が常に相互変換されます。

バイナリモードではソースファイル中の `\n` を、データファイル中の `\x0A' とします。  
つまり値を（勝手に）変換しません。結果的にデータファイルをそのまま読み書きできます。


CC BY-SA 3.0
2015-08-01T21:21:11.557
12932
2015-08-01T21:21:11.557
2017-04-13T12:52:38.920
-1
8589
12930
answer