バイナリモードでは発生せず、テキストモードで開かれたファイルに書き込む場合、どのような変換が行われますか?特にMS Visual Cで。
unsigned char buffer[256];
for (int i = 0; i < 256; i++) buffer[i]=i;
int size = 1;
int count = 256;
バイナリモード:
FILE *fp_binary = fopen(filename, "wb");
fwrite(buffer, size, count, fp_binary);
対テキストモード:
FILE *fp_text = fopen(filename, "wt");
fwrite(buffer, size, count, fp_text);
ほとんどのプラットフォームは、ストリームを処理するときに「t」オプションまたは「text-mode」オプションを無視すると思います。ただし、Windowsではこれは当てはまりません。 [〜#〜] msdn [〜#〜] でfopen()関数の説明を見ると、「t」オプションを指定すると次のような効果があることがわかります:
テキストモードでは、改行「\ n」はキャリッジリターン+改行「\ r\n」に変換される場合があります
通常は、バイナリモードで開きます。テキストモードでバイナリデータを読み取ろうとしても機能せず、破損します。ただし、バイナリモードでも問題なくテキストを読み取ることができます。「\ n」から「\ r\n」への自動変換は行われません。
fopen を参照
さらに、「rt」でファイルを開くと、Ctrl-Z文字で入力が終了します。
もう1つの違いは、fseek
を使用する場合です。
ストリームがバイナリモードで開かれている場合、新しい位置は、OriginがSEEK_SETの場合はファイルの先頭から、OriginがSEEK_CURの場合は現在のファイル位置から、OriginがSEEK_ENDの場合はファイルの最後から測定された正確なオフセットバイトです。一部のバイナリストリームは、SEEK_ENDをサポートしない場合があります。
ストリームがテキストモードで開いている場合、オフセットでサポートされる値はゼロ(すべてのOriginで機能します)と同じファイルに関連付けられたストリームでstd :: ftellへの以前の呼び出しによって返された値(のみで機能します) SEEK_SETの起源。
ファイルに改行文字が混在しているテキストモードでファイルを開くと、興味深い問題が発生しました。
1\n\r
2\n\r
3\n
4\n\r
5\n\r
私たちの要件は、現在の位置をファイルに保存し(fgetposを使用)、ファイルを閉じてから、ファイルを再度開いてその位置にシークできる(fsetposを使用)ことです。
ただし、ファイルの行末が混在している場合、このプロセスは実際の同じ位置へのシークに失敗しました。私たちの場合(私たちのツールはC++を解析します)、すでに見たファイルの一部を再読み込みしていました。
バイナリを使用してください。そうすれば、ファイルの読み取りと書き込みを正確に制御できます。