C++ 檔案與串流

你好,未來的程式設計師!今天,我們將進入C++檔案與串流的奇幻世界。身為你友善的電腦科學老師,我將引導你完成這次冒險。相信我,在這堂課結束時,你將能像專家一樣操作檔案!

C++ Files and Streams

開啟檔案

先從基礎開始。想像你有一個寶藏箱(這就是我們的檔案),你需要打開它來放入或取出東西。在C++中,我們使用稱為“串流”的東西與檔案互動。

要開啟一個檔案,我們使用ifstream類別進行讀取(輸入)和ofstream類別進行寫入(輸出)。如果你想要同時進行讀取和寫入,可以使用fstream類別。

以下是如何開啟一個檔案:

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

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

if (myFile.is_open()) {
cout << "寶藏箱打開了!" << endl;
} else {
cout << "哦不!我們無法打開寶藏箱。" << endl;
}

return 0;
}

在這個例子中,我們試圖開啟一個名為"treasure.txt"的檔案進行寫入。is_open()函數會檢查檔案是否成功開啟。

關閉檔案

當我們完成對寶藏箱的操作後,禮貌上(也是良好的實踐)應該關閉它。在C++中,當檔案串流物件超出範圍時,檔案會自動關閉,但我們最好還是明確地關閉它們:

myFile.close();

寫入檔案

現在我們已經打開了寶藏箱,讓我們把一些寶藏放進去!寫入檔案就像使用<<運算符一樣簡單:

ofstream myFile("treasure.txt");

if (myFile.is_open()) {
myFile << "金幣:100" << endl;
myFile << "魔杖:3" << endl;
myFile << "龍蛋:1" << endl;
cout << "寶藏已加入寶藏箱!" << endl;
} else {
cout << "打開寶藏箱失敗。" << endl;
}

myFile.close();

在這個例子中,我們正在向我們的檔案寫入三行。每個<<運算符將其後的文字寫入檔案,而endl則添加一個新行。

從檔案讀取

從檔案讀取就像我們在清點寶藏箱的庫存。我們使用ifstream類別和>>運算符從檔案中讀取:

#include <string>

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

if (myFile.is_open()) {
while (getline(myFile, line)) {
cout << line << endl;
}
myFile.close();
} else {
cout << "無法打開寶藏箱。" << 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 << "打開藏寶圖失敗!" << endl;
return 1;
}

// 寫入到檔案
file << "X標記了位置!";

// 移動到檔案開頭
file.seekg(0, ios::beg);

// 讀取內容
string content;
getline(file, content);
cout << "地圖上說:" << content << endl;

// 從開頭移動2個字符
file.seekp(2, ios::beg);

// 覆蓋部分內容
file << "不一定是標記";

// 移動到開頭並再次讀取
file.seekg(0, ios::beg);
getline(file, content);
cout << "現在地圖上說:" << content << endl;

file.close();
return 0;
}

在這個例子中,我們先寫入一個檔案,然後從中讀取,然後修改部分內容,最後再次讀取。這就像我們在更新我們的藏寶圖!

這就是了,勇敢的C++領域探險者!你已經學會如何打開寶藏箱(檔案),存儲你的戰利品(寫入數據),進行庫存(讀取數據),甚至更新你的藏寶圖(操作檔案內容)。記住,孰能生巧,所以請繼續編程和探險。誰知道你接下來會發現什麼數位寶藏呢?快樂編程!

Credits: Image by storyset