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