文件I/O - 文件读写操作

引言

文件输入输出(I/O)是编程中非常常见的任务,尤其是在处理大量数据或需要持久化存储时。C++ 提供了多种方式来进行文件的读写操作,包括使用标准库中的 fstreamifstreamofstream 类。本文将详细介绍如何在 C++ 中进行文件的读写操作,并通过实例帮助读者理解其使用方法。

1. 文件流类简介

C++ 标准库提供了三个主要的文件流类来处理文件 I/O 操作:

  • fstream:用于读写文件。
  • ifstream:专门用于读取文件。
  • ofstream:专门用于写入文件。

这些类都继承自 iostream 库中的基类 ios,因此可以使用类似的接口进行操作。

2. 文件打开与关闭

2.1 打开文件

要打开一个文件,可以使用文件流对象的构造函数或 open() 方法。以下是几种常见的打开模式:

  • ios::in:以只读方式打开文件。
  • ios::out:以只写方式打开文件。
  • ios::app:以追加方式打开文件,所有写入的数据都会添加到文件末尾。
  • ios::binary:以二进制模式打开文件。
  • ios::trunc:如果文件存在,则先删除文件内容再打开。
cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    // 使用构造函数打开文件
    std::ofstream outFile("example.txt", std::ios::out);
    if (!outFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 或者使用 open() 方法
    std::ifstream inFile;
    inFile.open("example.txt", std::ios::in);
    if (!inFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 关闭文件
    outFile.close();
    inFile.close();

    return 0;
}

2.2 关闭文件

使用完文件后,应该调用 close() 方法关闭文件,以确保所有缓冲区的数据都被正确写入文件,并释放相关资源。

cpp 复制代码
fileStream.close();

3. 文件写入操作

3.1 写入文本文件

使用 ofstream 可以方便地向文本文件中写入数据。可以直接使用插入运算符 << 来写入字符串、数字等数据类型。

cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    std::ofstream outFile("example.txt", std::ios::out);
    if (!outFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    outFile << "Hello, World!" << std::endl;
    outFile << "这是第二行文本" << std::endl;

    outFile.close();
    return 0;
}

3.2 写入二进制文件

对于二进制文件,可以使用 write() 方法来写入原始字节数据。需要注意的是,二进制文件的内容不能直接用文本编辑器查看。

cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    int data = 42;
    std::ofstream binFile("data.bin", std::ios::out | std::ios::binary);
    if (!binFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    binFile.write(reinterpret_cast<char*>(&data), sizeof(data));

    binFile.close();
    return 0;
}

4. 文件读取操作

4.1 读取文本文件

使用 ifstream 可以从文本文件中读取数据。可以直接使用提取运算符 >> 来读取基本数据类型,或者使用 getline() 方法来读取整行文本。

cpp 复制代码
#include <fstream>
#include <iostream>
#include <string>

int main() {
    std::ifstream inFile("example.txt", std::ios::in);
    if (!inFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    std::string line;
    while (std::getline(inFile, line)) {
        std::cout << line << std::endl;
    }

    inFile.close();
    return 0;
}

4.2 读取二进制文件

对于二进制文件,可以使用 read() 方法来读取原始字节数据。同样需要注意,读取的数据需要根据实际类型进行解释。

cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    int data;
    std::ifstream binFile("data.bin", std::ios::in | std::ios::binary);
    if (!binFile) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    binFile.read(reinterpret_cast<char*>(&data), sizeof(data));
    std::cout << "读取的数据: " << data << std::endl;

    binFile.close();
    return 0;
}

5. 文件位置控制

有时我们需要在文件中移动读写指针的位置。可以使用以下方法来控制文件指针:

  • seekg():设置输入文件指针的位置。
  • seekp():设置输出文件指针的位置。
  • tellg():获取当前输入文件指针的位置。
  • tellp():获取当前输出文件指针的位置。
cpp 复制代码
#include <fstream>
#include <iostream>

int main() {
    std::fstream file("example.txt", std::ios::in | std::ios::out);
    if (!file) {
        std::cerr << "无法打开文件" << std::endl;
        return 1;
    }

    // 移动到文件开头
    file.seekg(0, std::ios::beg);

    // 获取当前位置
    std::streampos pos = file.tellg();
    std::cout << "当前位置: " << pos << std::endl;

    // 移动到文件末尾
    file.seekg(0, std::ios::end);

    file.close();
    return 0;
}

6. 总结

文件 I/O 是 C++ 编程中不可或缺的一部分,掌握文件的读写操作可以帮助我们更好地处理和管理数据。通过本文的介绍,相信读者已经对 C++ 中的文件 I/O 操作有了较为全面的了解。如果你有任何问题或需要进一步的帮助,请随时留言讨论!

相关推荐
哎呦,帅小伙哦1 分钟前
学习标准库atomic_base.h中typedef enum memory_order
c++·内存顺序
梓䈑6 分钟前
【C++】类和对象(下):友元、static成员、内部类、explicit 和 匿名对象
c语言·开发语言·c++
捕鲸叉14 分钟前
第01章 数据模型02 vtkPolyData类介绍
c++·vtk
Bucai_不才26 分钟前
【C++】构造函数与析构函数
开发语言·c++
草原上唱山歌38 分钟前
轻量级适合阅读的优秀 C++ 开源项目
开发语言·c++·开源
苹果40 分钟前
C++二十三种设计模式之抽象工厂模式
c++·设计模式·抽象工厂模式
旧物有情1 小时前
蓝桥杯历届真题--#R格式(C++,Java) 高精度运算
java·c++·蓝桥杯
闻缺陷则喜何志丹2 小时前
【C++动态规划】1547. 切棍子的最小成本|2116
c++·算法·动态规划·力扣·最小·成本·棍子
兵哥工控2 小时前
MFC读写文件实例
c++·mfc
c-c-developer3 小时前
C++Primer const限定符
c++