C++ 基础

C++ 主页 C++ 概述 C++ 环境设置 C++ 基本语法 C++ 注释 C++ Hello World C++ 省略命名空间 C++ 标记 C++ 常量/字面量 C++ 关键字 C++ 标识符 C++ 数据类型 C++ 数字数据类型 C++ 字符数据类型 C++ 布尔数据类型 C++ 变量类型 C++ 变量作用域 C++ 多变量 C++ 基本输入/输出 C++ 修饰符类型 C++ 存储类 C++ 数字 C++ 枚举 C++ 枚举类 C++ 引用 C++ 日期和时间

C++ 运算符

C++ 运算符 C++ 算术运算符 C++ 关系运算符 C++ 逻辑运算符 C++ 位运算符 C++ 赋值运算符 C++ sizeof 运算符 C++ 条件运算符 C++ 逗号运算符 C++ 成员运算符 C++ 强制类型转换运算符 C++ 指针运算符 C++ 运算符优先级 C++ 一元运算符

C++ 控制语句

C++ 决策语句 C++ if 语句 C++ if else 语句 C++ 嵌套 if 语句 C++ switch 语句 C++ 嵌套 switch语句 C++ 循环类型 C++ while 循环 C++ for 循环 C++ do while 循环 C++ Foreach 循环 C++ 嵌套循环 C++ break 语句 C++ continue 语句 C++ goto 语句

C++ 字符串

C++ 字符串 C++ 循环遍历字符串 C++ 字符串长度 C++ 字符串连接 C++ 字符串比较

C++ 函数

C++ 函数 C++ 多函数参数 C++ 递归函数 C++ 返回值 C++ 函数重载 C++ 函数重写 C++ 默认参数

C++ 数组

C++ 数组 C++ 多维数组 C++ 指向数组的指针 C++ 将数组传递给函数 C++ 从函数返回数组

C++ 结构 &联合

C++ 结构 C++ 联合

C++ 指针

C++ 指针 C++ 解引用 C++ 修改指针

C++ 类和对象

C++ 面向对象 C++ 类 &对象 C++ 类成员函数 C++ 类访问修饰符 C++ 静态类成员 C++ 静态数据成员 C++ 静态成员函数 C++ 内联函数 C++ this 指针 C++ 友元函数 C++ 指向类的指针

C++ 构造函数

C++ 构造函数 &析构函数 C++ 默认构造函数 C++ 参数化构造函数 C++ 复制构造函数 C++ 构造函数重载 C++ 带默认参数的构造函数 C++ 委托构造函数 C++ 构造函数初始化列表 C++ 使用构造函数动态初始化

C++ 继承

C++ 继承 C++ 多重继承 C++ 多级继承

C++ 面向对象

C++ 重载 C++ 多态性 C++ 抽象 C++ 封装 C++ 接口 C++ 虚函数 C++ 纯虚函数与抽象类

C++ 文件处理

C++ 文件和流 C++ 文件读取

C++ 进阶

C++ 异常处理 C++ 动态内存 C++ 命名空间 C++ 模板 C++ 预处理器 C++ 信号处理 C++ 多线程 C++ Web 编程 C++ 套接字编程 C++ 并发 C++ 高级概念 C++ Lambda 表达式 C++ unordered_multiset

C++ 实用资源

C++ 问答 C++ 快速指南 C++ 速查表 C++ STL 教程 C++ 标准库 C++ 实用资源 C++ 讨论


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() 状态,以检测诸如意外的文件末尾或数据损坏之类的错误。