今更、fread()

モード|動作 |ファイルがあるとき |ファイルがないとき

"r" |読み出し専用 |正常 |エラー(NULL返却)
"w" |書き込み専用 |サイズを 0 にする(上書き)|新規作成
"a" |追加書き込み専用 |最後に追加する |新規作成
"r+" |読み込みと書き込み |正常 |エラー(NULL返却)
"w+" |書き込みと読み込み |サイズを 0 にする(上書き)|新規作成
"a+" |読み込みと追加書き込み|最後に追加する |新規作成

※ "r"、"w"、"a" はそれぞれ「読み」、「書き」、「追加」の専用モードです。
つまり、"r"モードで fopen したファイルに書き込み動作を行うことは出来ません。
"r+" と "w+" は一見同じ「読み書き」可能に見えますが、先に来るモードが主となる
ため、ファイルの有無で動作が異なります。
また、"a+" の書き込みは「追加書き込み」しか出来ません。

バイナリモード|動作

(省略時) |テキストモード

出力時 : 改行文字 '\n'(0x0a)
⇒ '\r' / '\n'(0x0d / 0x0a)に変換
入力時 : '\r' / '\n'(0x0d / 0x0a)
⇒ 改行文字 '\n'(0x0a)に変換
0x1a を EOF(ファイルエンドとする)

"b" |バイナリモード("wb"、"rb" のように指定)

上記の変換を行わない
0x1a を EOF扱いしない


MicroSoft系の OS では、テキストファイルの改行は '\r'(0x0d:復帰)と
'\n'(0x0a:改行)の2つの コードで表されます。
そのため、テキストモードで改行コード '\n' をファイルに書き込もうとすると、
'\r' '\n' の2文字に変換して書き込みます。
逆に読み込みでファイルに '\r' '\n' の改行コードがあれば '\n' の 1文字に変換します。
また、テキストファイル終端の 0x1a を EOF(ファイルエンド)として扱います。(2002.04.08修正)
しかし、バイナリファイルには「0x1a」、「0x0d」、「0x0a」はデータとして存在する可能性があり、
それをテキストモードのように変換されては困ってしまいます。
そのため、MicroSoft系のC言語ではテキストモードとバイナリモードを区別します。
なお、UNIX系のC言語ではこれらの区別は不要です。


fread() 使用時の注意
fread() 関数を使用してファイルを読み出すときに、普通に開いたストリームを使用すると CRLF が LF に変換されるので注意が必要です。
厳密には、変換されるのは fopen() 時にテキストモードで開いた場合で、バイナリ指定("rb" など)を指定した場合は、CRLF が変換されることなく読み取ることが出来ます。
Windows のテキストファイルでは、CRLF が改行の基本なので、テキストファイルだからといってテキストモードで開いてはいけなそうです --;