在C++中处理文件系统:从基础到高级技巧
文件系统操作是C++开发中的基本任务之一。无论是保存应用程序设置、处理日志,还是创建复杂的数据管理系统——读取、写入和操作文件及目录的能力是每位C++开发者的必备技能。本文将介绍通过fstream进行文件操作的传统方法,以及使用std::filesystem库(C++17及更高版本)的现代方法。
文件操作基础:fstream库
fstream库(<fstream>)提供了三个用于文件操作的主要类:
ifstream— 用于从文件读取(input file stream);ofstream— 用于写入文件(output file stream);fstream— 用于同时读写。
从文件读取数据
来看一个打开并逐行读取文本文件的最简单示例:
#include <iostream>#include <fstream>#include <string>
int main() { std::ifstream inputFile("data.txt"); if (!inputFile.is_open()) { std::cerr << "Ошибка открытия файла!" << std::endl; return 1; }
std::string line; while (std::getline(inputFile, line)) { std::cout << line << std::endl; }
inputFile.close(); return 0;}务必始终使用is_open()方法检查文件是否成功打开。文件会在离开作用域时自动关闭,但显式调用close()被认为是一种良好的实践。
将数据写入文件
写入文件类似于向控制台输出——使用<<运算符:
#include <fstream>
int main() { std::ofstream outputFile("output.txt"); if (!outputFile) { std::cerr << "Не удалось создать файл!" << std::endl; return 1; }
outputFile << "Строка 1" << std::endl; outputFile << "Строка 2" << std::endl; outputFile << 42 << std::endl; // 数字会自动以文本形式写入
outputFile.close(); return 0;}默认情况下,ofstream会覆盖文件。要追加数据到末尾,请使用std::ios::app标志:
std::ofstream outputFile("log.txt", std::ios::app);二进制文件和随机访问
要处理二进制数据,请使用std::ios::binary标志。read()和write()方法允许操作内存块:
#include <fstream>
struct Record { int id; char name[50];};
int main() { // 写入结构体 Record rec = {1, "Пример"}; std::ofstream binOut("data.bin", std::ios::binary); binOut.write(reinterpret_cast<char*>(&rec), sizeof(rec)); binOut.close();
// 读取结构体 Record recIn; std::ifstream binIn("data.bin", std::ios::binary); binIn.read(reinterpret_cast<char*>(&recIn), sizeof(recIn)); binIn.close();
return 0;}要在文件内定位,请使用seekg()(用于输入)和seekp()(用于输出),配合参数std::ios::beg、std::ios::cur或std::ios::end。
现代C++:std::filesystem库
从C++17开始,标准库中加入了std::filesystem模块,它极大地简化了文件系统操作。它提供了便捷的函数用于操作路径、文件和目录