C++ 文件系统操作:实用指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

引言:为什么 C++ 中的文件系统操作是基础

\n\n

任何严肃的程序迟早都会遇到将数据保存到磁盘或从磁盘读取数据的需求。配置文件、日志、数据库、用户文档——所有这些都需要与文件系统交互的能力。在 C++ 中,有两种主要方法:经典的输入/输出流(<fstream> 库)和更现代、更高级的 std::filesystem(从 C++17 开始)。

\n\n

在本文中,我们将分析实际场景:从简单的文本文件读写到目录导航和错误处理。所有示例均使用 C++17/20 编写,可直接用于您的项目。

\n\n

1. 基础:使用 fstream 读写文件

\n\n

<fstream> 库提供了三个主要类:ifstream(输入流——读取)、ofstream(输出流——写入)和 fstream(双向流)。我们通过示例来了解它们。

\n\n

1.1. 写入文本文件

\n\n

写入数据最简单的方法是使用 ofstream。如果文件不存在,它将被创建。如果存在,它将被覆盖(默认模式为 ios::trunc)。

\n\n
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n    std::ofstream outFile("example.txt");\n    if (!outFile) {\n        std::cerr << "打开文件写入时出错\\n";\n        return 1;\n    }\n\n    outFile << "你好,C++ 文件系统!\\n";\n    outFile << "第二行\\n";\n    outFile << 42 << " — 这是一个数字。\\n";\n\n    outFile.close(); // 手动关闭不是必须的,但这是一个好习惯\n    std::cout << "数据已写入。\\n";\n    return 0;\n}
\n\n

1.2. 从文本文件读取

\n\n

使用 ifstream 进行读取。最可靠的方法是通过 std::getline 逐行读取。

\n\n
#include <iostream>\n#include <fstream>\n#include <string>\n\nint main() {\n    std::ifstream inFile("example.txt");\n    if (!inFile) {\n        std::cerr << "未找到文件或无法打开文件\\n";\n        return 1;\n    }\n\n    std::string line;\n    while (std::getline(inFile, line)) {\n        std::cout << "已读取: " << line << '\\n';\n    }\n\n    inFile.close();\n    return 0;\n}
\n\n

1.3. 打开模式与二进制文件

\n\n

您可以组合使用打开标志:ios::app(追加写入)、ios::binary(二进制模式)、ios::ate(定位到文件末尾)。对于二进制文件,请使用 read() 和 write() 方法。

\n\n
#include <fstream>\n#include <vector>\n\n// 示例:以二进制格式写入和读取整数向量\nvoid saveVector(const std::string& filename, const std::vector<int>& data) {\n    std::ofstream file(filename, std::ios::binary);\n    if (!file) return;\n    file.write(reinterpret_cast<const char*>(data.data()), data.size() * sizeof(int));\n}\n\nstd::vector<int> loadVector(const std::string& filename) {\n    std::ifstream file(filename, std::ios::binary);\n    if (!file) return {};\n    file.seekg(0, std::ios::end);\n    size_t size = file.tellg() / sizeof(int);\n    file.seekg(0, std::ios::beg);\n    std::vector<int> data(size);\n    file.read(reinterpret_cast<char*>(data.data()), size * sizeof(int));\n    return data;\n}
\n\n

2. 现代方法:std::filesystem (C++17)

\n\n

从 C++17 开始,标准库中包含了 <filesystem> 模块,它允许以高级、跨平台的方式处理路径、文件和目录。

\n\n

2.1. 检查文件是否存在并获取文件信息

\n\n

更多

博客

书籍推荐