C++ 檔案與串流
你好,未來的程式設計師!今天,我們將進入C++檔案與串流的奇幻世界。身為你友善的電腦科學老師,我將引導你完成這次冒險。相信我,在這堂課結束時,你將能像專家一樣操作檔案!
開啟檔案
先從基礎開始。想像你有一個寶藏箱(這就是我們的檔案),你需要打開它來放入或取出東西。在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