C++ 文件系统操作:完整指南

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

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

开始课程

在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模块,它极大地简化了文件系统操作。它提供了便捷的函数用于操作路径、文件和目录

博客

书籍推荐