C++ 读取文件
C++ 中的文件 I/O(输入/输出)是指读取和写入文件的过程。C++ 通过标准库中的 <fstream> 头文件提供了文件处理功能。 文件 I/O 允许程序持久化数据、与外部资源交互以及在程序执行范围之外存储/检索信息。
文件流的类型
文件流主要有三种类型,每种类型都与不同的操作相关 -
- ifstream(输入文件流) - 用于从文件读取数据。
- ofstream(输出文件流) - 用于将数据写入文件。
- fstream(文件流) - 用于文件的输入和输出操作。它结合了 ifstream 和 ofstream 的功能。
文件 I/O 的基本步骤
文件 I/O 的基本步骤如下:
打开文件
在读取或写入文件之前,必须使用某个文件流类打开文件。如果文件成功打开,程序将继续执行 I/O 操作。
执行文件操作
您可以使用适当的方法读取或写入文件。
关闭文件
文件操作完成后,您应该关闭文件,以确保所有数据都已刷新,并且文件已正确释放。
使用 ifstream(流提取运算符)读取
使用流提取运算符 (>>) 是在 C++ 中从文件读取数据的最简单方法。此运算符从文件中读取格式化数据,类似于从标准输入读取数据的方式。
示例
以下是使用 ifstream 读取的示例 -
#include <fstream> #include <iostream> #include <string> int main() { std::ifstream inputFile("example.txt"); // 打开文件进行读取 if (!inputFile) { std::cerr << "Error opening file!" << std::endl; return 1; } std::string word; while (inputFile >> word) { // 读取直到遇到空格 std::cout << word << std::endl; // 打印文件中的每个单词 } inputFile.close(); // 完成后关闭文件 return 0; }
此处,>> 运算符逐字读取数据,并在空格(空格、换行符等)处停止。
但它无法处理文本行的读取(因为它会在空格处停止),并且读取复杂数据格式(例如包含空格的行)时可能比较棘手。
使用 getline() 读取行
如果您想读取整行或文本(包括步骤),可以使用 getline() 函数。此函数将从文件中读取字符,直到遇到换行符 (' ')。
示例
以下是使用 getline() 读取行的示例 -
#include <fstream> #include <iostream> #include <string> int main() { std::ifstream inputFile("example.txt"); // 打开文件进行读取 if (!inputFile) { std::cerr << "Error opening file!" << std::endl; return 1; } std::string line; while (std::getline(inputFile, line)) { // 读取一整行文本 std::cout << line << std::endl; // 将该行输出到控制台 } inputFile.close(); // 完成后关闭文件 return 0; }
读取二进制文件(使用 read())
以上讨论的方法适用于文本文件,对于二进制文件,您可以使用 read() 函数从文件中读取原始二进制数据。
示例
以下是读取二进制文件的示例(使用 read())-
#include <iostream> #include <fstream> int main() { std::ifstream file("example.bin", std::ios::binary); // 检查文件是否成功打开 if (!file) { std::cerr << "Error opening file!" << std::endl; return 1; } // 获取文件长度 file.seekg(0, std::ios::end); std::streamsize size = file.tellg(); file.seekg(0, std::ios::beg); // 将整个文件内容读入缓冲区 char* buffer = new char[size]; file.read(buffer, size); // 打印原始数据(可选,用于演示) for (std::streamsize i = 0; i < size; ++i) { std::cout << std::hex << (0xFF & buffer[i]) << " "; // 以十六进制打印字节 } delete[] buffer; file.close(); return 0; }
处理文件 I/O 中的错误
处理错误对于确保程序在文件不可用、无法打开或在读取/写入过程中出现意外情况时正常运行非常重要。
使用 fail()
、eof()
和 good()
检查错误。
C++ 提供了 ifstream/ofstream 对象的多个成员函数来检查各种情况。
- fail():检查 I/O 期间是否发生了不可恢复的错误。
- eof():检查是否已到达文件末尾 (EOF)。
- good():如果没有发生错误,则返回 true。
处理文件末尾 (EOF)
从文件读取时,处理到达文件末尾的情况非常重要。标准方法是使用 eof() 或 std::getline() 运算符,这些运算符会在到达文件末尾时自动停止。
优雅地处理 I/O 错误
在文件操作期间,您应该检查 fail() 或 bad() 状态,以检测诸如意外的文件末尾或数据损坏之类的错误。