C++怎么从文件中读取数据?

文章导读
Previous Quiz Next C++ 中的文件 I/O(输入/输出)是从文件读取数据并向文件写入数据的过程。C++ 通过标准库中的 <fstream> 头文件提供文件处理功能。文件 I/O 允许程序持久化数据、与外部资源交互,并在程序执行范围之外存储
📋 目录
  1. 文件流类型
  2. 文件 I/O 的基本步骤
  3. 使用 ifstream 读取(流提取运算符)
  4. 使用 getline() 读取行
  5. 读取二进制文件 (使用 read())
  6. 处理文件 I/O 中的错误
A A

C++ 从文件读取



Previous
Quiz
Next

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 << "打开文件出错!" << std::endl;
      return 1;
   }

   std::string word;
   while (inputFile >> word) {  // 读取直到遇到空白字符
      std::cout << word << std::endl;  // 打印文件中的每个单词
   }

   inputFile.close();  // 操作完成后关闭文件
   return 0;
}

在此,>> 运算符逐词读取数据,在空白字符(空格、换行符等)处停止。

但它无法处理读取文本行(因为在空白字符处停止),对于读取包含空格的复杂数据格式(如包含空格的行)可能会很棘手。

使用 getline() 读取行

如果要读取整行文本,包括空格,可以使用 getline() 函数。该函数将从文件中读取字符,直到遇到换行符('\n')为止。

示例

以下是使用 getline() 读取行的示例 −

#include <fstream>
#include <iostream>
#include <string>

int main() {
   std::ifstream inputFile("example.txt");  // 打开文件进行读取
   if (!inputFile) {
      std::cerr << "打开文件出错!" << 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);

   // 将整个文件内容读取到 buffer 中
   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() 状态,以检测意外的文件末尾或数据损坏等错误。