C++ ファイルとストリーム

こんにちは、未来のプログラマーたち!今日、私たちはC++のファイルとストリームの世界に冒険するような素晴らしい旅に出かけます。あなたの優しくて近所のコンピューターサイエンスの先生として、私はあなたをこの冒険のガイドします。信じてください、このレッスンの終わりまでに、あなたはプロのようにファイルを操作できるようになるでしょう!

C++ Files and Streams

ファイルを開く

基本から始めましょう。宝蔵の chest(それは私たちのファイル)があり、中に何かを入れたり、何かを取り出したりするために開ける必要があると想像してください。C++では、ファイルと対話するために「ストリーム」というものを使用します。

ファイルを開くには、読み取り(入力)には ifstream クラスを使用し、書き込み(出力)には ofstream クラスを使用します。両方を行いたい場合は、fstream クラスを使用できます。

以下はファイルを開く方法です:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
ofstream myFile("treasure.txt");

if (myFile.is_open()) {
cout << "宝蔵の chest が開いています!" << endl;
} else {
cout << "おやなに!宝蔵の chest を開けませんでした。" << endl;
}

return 0;
}

この例では、書き込み用に "treasure.txt" という名前のファイルを開こうとしています。is_open() 関数は、ファイルが正常に開かれたかどうかを確認します。

ファイルを閉じる

宝蔵の chest でおしまいになったら、礼儀正しく(そして良いプラクティスとして)閉じることができます。C++では、ファイルストリームオブジェクトがスコープを抜けたときに自動的にファイルが閉じられますが、明示的に閉じる方が良いです:

myFile.close();

ファイルに書き込む

今では宝蔵の chest を開いて、中に宝を入れましょう!ファイルに書き込むのは << 演算子を使うだけの簡単なことです:

ofstream myFile("treasure.txt");

if (myFile.is_open()) {
myFile << "金貨:100" << endl;
myFile << "魔法の杖:3" << endl;
myFile << "ドラゴンの卵:1" << endl;
cout << "宝蔵を chest に追加しました!" << endl;
} else {
cout << "宝蔵の chest を開けませんでした。" << endl;
}

myFile.close();

この例では、ファイルに3行を書き込んでいます。各 << 演算子は次のテキストをファイルに書き込み、endl は新しい行を追加します。

ファイルから読み取る

ファイルから読み取るのは、宝蔵の chest の在庫を取り入れるようなものです。私たちは ifstream クラスと >> 演算子を使ってファイルから読み取ります:

#include <string>

ifstream myFile("treasure.txt");
string line;

if (myFile.is_open()) {
while (getline(myFile, line)) {
cout << line << endl;
}
myFile.close();
} else {
cout << "宝蔵の chest を開けませんでした。" << endl;
}

ここでは、getline() を使ってファイルから各行を読み取り、コンソールに印刷しています。while ループはファイルの終わりに達するまで続きます。

読み取りと書き込みの例

より複雑な例として、読み取りと書き込みを組み合わせて、宝の在庫を管理するプログラムを作りましょう:

#include <fstream>
#include <iostream>
#include <string>
using namespace std;

int main() {
// ファイルに書き込む
ofstream outFile("inventory.txt");
if (outFile.is_open()) {
outFile << "金貨:100" << endl;
outFile << "魔法の杖:3" << endl;
outFile << "ドラゴンの卵:1" << endl;
outFile.close();
cout << "在庫を保存しました!" << endl;
} else {
cout << "在庫を保存できませんでした。" << endl;
return 1;
}

// ファイルから読み取る
ifstream inFile("inventory.txt");
string item;
int count;

if (inFile.is_open()) {
cout << "現在の在庫:" << endl;
while (inFile >> item >> count) {
cout << item << " " << count << endl;
}
inFile.close();
} else {
cout << "在庫を読み取れませんでした。" << endl;
return 1;
}

return 0;
}

この例では、まず在庫をファイルに書き込み、それから読み取って表示します。>> を使って単語と数字を別々に読み取るのに注意してください。

ファイル位置ポインタ

本を読んでいて、どこにいるかを追うことができるように、ファイル位置ポインタはファイルに対して同じことをします。ファイルの中でどこにいるかを追跡します。

以下はファイル位置ポインタを操作するための便利な関数です:

関数 説明
tellg() 入力用のゲットポインタの現在の位置を返します
tellp() 出力用のプットポインタの現在の位置を返します
seekg() ゲットポインタの位置を設定します
seekp() プットポインタの位置を設定します

以下はその例です:

#include <fstream>
#include <iostream>
using namespace std;

int main() {
fstream file("treasure_map.txt", ios::in | ios::out);

if (!file.is_open()) {
cout << "宝蔵の map を開けませんでした!" << endl;
return 1;
}

// ファイルに書き込む
file << "X はその場所を示しています!";

// ファイルの先頭に移動
file.seekg(0, ios::beg);

// コンテンツを読み取る
string content;
getline(file, content);
cout << "map には「" << content << "」と書いてあります。" << endl;

// 先頭から2文字目に移動
file.seekp(2, ios::beg);

// コンテンツの一部を上書き
file << "常にその場所を示しているわけではありません";

// 先頭に移動して再び読み取る
file.seekg(0, ios::beg);
getline(file, content);
cout << "今、map には「" << content << "」と書いてあります。" << endl;

file.close();
return 0;
}

この例では、ファイルに書き込んだ後、読み取り、その一部を修正し、最後に再び読み取ることができます。まるで宝蔵の map を更新しているようです!

そしてそれで、C++の領域の勇敢な冒険者たち!あなたは宝蔵の chest(ファイル)を開く方法、宝を保管する(データを書き込む)方法、在庫を取る(データを読み取る)方法、そして宝蔵の map(ファイルの内容)を更新する方法を学びました。練習は成功のもとですので、コーディングを続け、探検しましょう。次にどんなデジタルの宝を発見するか、誰にも分かりませんね?幸せなコーディングを!

Credits: Image by storyset