mode 文字列 その2

Microsoft固有の拡張

mode に次の値を追加すると、改行文字の変換モードを指定できます。
このページにあるmodeはfopenと_fdopenのMicrosoft固有の拡張です。 ソースファイルに互換を持たせたい場合は使用しないようにしましょう。

t

ファイルをテキスト(変換)モードで開きます。このモードでは、 Ctrl + Z は入力時にEOF(EOF: end-of-file)文字として解釈されます。 読み出しおよび書き込み用に"a+"モードで開いたファイルでは、 fopenがファイル末尾の CTRL+Zの有無を調べ、削除できる場合は削除します。 この処理が行われる理由は、CTRL+Zで終わるファイルの中身を fseek関数および ftell関数で移動するとき、 ファイル末尾付近で fseekが正しく動作しないことがあるためです。
さらにテキスト モードでは、入力時にキャリッジリターン(CR[0x0D])と ラインフィード(LF[0x0A])は単独のラインフィードに変換され、 出力時にラインフィードはキャリッジ リターンとラインフィードに変換されます。 Unicodeのストリーム入出力関数が既定のテキストモードで動作すると、 入力元または出力先のストリームはマルチバイト文字のシーケンスと仮定されます。 このため、Unicodeストリーム入力関数はマルチバイト文字をワイド文字に変換し、 mbtowc関数を呼び出した場合と同様の効果を得ます。同様の理由で、Unicodeストリーム出力関数は、 wctomb関数が呼び出されたかのように、ワイド文字をマルチバイト文字に変換します。

b

ファイルをバイナリ (無変換) モードで開きます。 キャリッジリターンとラインフィードの変換は行われません。

tかbをmode中に指定しないと、既定の変換モードはグローバル変数_fmodeによって定義されます。 tやbを引数の先頭に指定すると、エラーが発生してNULLが返されます。

c

filenameに関連付けられたコミットフラグを有効にして、fflushか_flushallのいずれかが呼び出された場合に、 ファイルバッファの内容がディスクに直接書き込まれるようにします。

n

filenameに関連付けられたコミットフラグを"コミットなし"にリセットします。 これが既定の設定です。プログラムがCOMMODE.OBJにリンクされている場合、 グローバルコミットフラグも上書きします。プログラムが明示的にCOMMODE.OBJにリンクされていない場合、 グローバルコミットフラグの既定の設定は"コミットなし"です。

S

キャッシュがディスクからのシーケンシャルアクセスに最適化されるように指定します。 ただし、シーケンシャルアクセスに限定されるわけではありません。

R

キャッシュがディスクからのランダムアクセスに最適化されるように指定します。 ただし、ランダムアクセスに限定されるわけではありません。

T

ファイルを一時ファイルとして指定します。可能な場合、ファイルはディスクにフラッシュされません。

D

ファイルを一時ファイルとして指定します。最後のファイルポインタが閉じられると、 ファイルは削除されます。

fopenや_fdopenのmode文字列に使用できる文字は、_openや_sopenで使用する引数oflag に 次のように対応しています。

mode文字列の文字 対応する_open/_sopenのoflag値

a _O_WRONLY |_O_APPEND (通常は _O_WRONLY |_O_CREAT |_O_APPEND)
a+ _O_RDWR |_O_APPEND (通常は _O_RDWR |_O_APPEND |_O_CREAT )
R _O_RDONLY
r+ _O_RDWR
W _O_WRONLY (通常は _O_WRONLY |_O_CREAT |_O_TRUNC)
W+ _O_RDWR (通常は _O_RDWR |_O_CREAT |_O_TRUNC)
B _O_BINARY
T _O_TEXT
C なし
N なし
S _O_SEQUENTIAL
R _O_RANDOM
T _O_SHORTLIVED
D _O_TEMPORARY

rbモードを使用し、コードを移植する必要がなく、大量のファイルを読み込む予定があり、 ネットワークパフォーマンスを気にする必要もない場合は、メモリマップド Win32ファイルも省略できます。