C++におけるテキストモードとバイナリモードのファイル操作の違い
C++でファイル入出力を行う場合、ストリームはテキストモードまたはバイナリモードのいずれかで開きます。両者の根本的な違いは、入出力時に文字変換が行われるかどうかという点にあります。
テキストモードとバイナリモードの違い
テキストモードでは、OS固有の改行コード表現に合わせて文字変換が自動的に行われます。たとえばWindows環境では、プログラム内の「\n」はディスク上で「\r\n」として書き込まれ、読み込み時には逆に「\r\n」が「\n」へ変換されます。これにより、OSの違いを意識せずに一貫したテキスト処理が可能になります。
一方、バイナリモードでは一切の変換が行われません。バイト列がメモリとディスクの間でそのままコピーされるため、画像・音声・実行ファイルなど、どんなデータでも正確に扱えます。
| テキストモード | バイナリモード |
|---|---|
| 各種文字変換が行われる (例:「\r\n」⇔「\n」) |
文字変換は一切行われない |
| 設定ファイル・ログ・CSVなど、テキストデータの入出力に適している | 画像・音声・動画・独自形式データなど、1バイトも変更できないデータの入出力に必須 |
ファイルへの書き込み方法
テキストモードの場合
// コンストラクタで開く
ofstream ofs("file.txt");
// open() メンバ関数で開く
ofstream ofs;
ofs.open("file.txt");
バイナリモードの場合
// コンストラクタで開く
ofstream ofs("file.txt", ios::binary);
// open() メンバ関数で開く
ofstream ofs;
ofs.open("file.txt", ios::binary);
ファイル末尾への追記方法
既存ファイルの末尾にデータを追加するには、ios::app を指定します。バイナリモードで追記する場合は、ビット演算子「|」を使って ios::binary と組み合わせます。
テキストモードの場合
ofstream ofs("file.txt", ios::app);
// または
ofstream ofs;
ofs.open("file.txt", ios::app);
バイナリモードの場合
ofstream ofs("file.txt", ios::app | ios::binary);
// または
ofstream ofs;
ofs.open("file.txt", ios::app | ios::binary);
ファイルの読み込み方法
テキストモードの場合
ifstream in("file.txt");
// または
ifstream in;
in.open("file.txt");
バイナリモードの場合
ifstream in("file.txt", ios::binary);
// または
ifstream in;
in.open("file.txt", ios::binary);
使い分けのポイント
- テキストモード: 人間が読み書きするテキストデータ(設定ファイル、ログ、CSVなど)の入出力に向いています。OS間の改行コードの違いを吸収してくれます。
- バイナリモード: JPEG・PNGなどの画像、MP3・WAVなどの音声、動画、独自形式のデータファイルなど、内容が1バイトでも変わっては困るデータの入出力に使用します。
なお、LinuxやmacOSでは改行コードが「\n」で統一されているため、テキストモードとバイナリモードの動作にほとんど差はありません。両者の違いが顕著に現れるのは、主にWindows環境です。
-
C++における「struct」と「typedef struct」の違いとは?
```html 結論:C++では両者に実質的な違いはない C++において、「struct」を使った宣言と「typedef struct」を使った宣言の間には、実質的な違いがありません。その理由は、C++ではstruct、union、enum、classによるすべての宣言が、暗黙的にtypedefされたものと同じように扱われるためです。ただし、同じ名前を持つ別の宣言によってその名前が隠されている場合を除きます。 なぜ違いが生まれないのか C言語では、構造体を宣言しただけでは型名として直接使えず、「struct タグ名」という形式で記述する必要がありました。そのため、変数宣言のたびにstructキ
-
C++の文字リテラルと文字列リテラルの違いをわかりやすく解説
C++における文字リテラルと文字列リテラルの基本C++では、シングルクォート( )で囲まれた1文字は「文字リテラル」として扱われ、その型は char になります。例えば a は char 型であり、ASCIIベースのシステムでは整数値 97 を持ちます。一方、ダブルクォート( )で囲まれた1文字または複数文字の並びは「文字列リテラル」として扱われます。その型は const char[] であり、実体は「文字列の長さ + 1」のサイズを持つ配列です。この余分な1文字分は、文字列の終端を示すヌル文字(\0)として確保されています。具体的な違いのポイント文字リテラル: 原則として1文字のみを格納する