C++复习之文件操作

在 C++ 中,文件操作主要依赖于 fstream 库,该库提供了文件输入输出的基础功能。文件操作可以分为读取文件和写入文件两部分,分别对应 ifstream(文件输入流)和 ofstream(文件输出流)。

fstream 类同时支持文件的读写操作。

接下来,我将详细介绍 C++ 中文件操作的相关知识,包括文件的打开、读取、写入、关闭等操作。

在这里插入图片描述


1. 包含头文件 <fstream>

在进行文件操作前,需要包含 <fstream> 头文件,该头文件提供了文件流类的定义:

#include <fstream>
#include <iostream>

2. 文件流类

<fstream> 头文件定义了三个主要的类:

  • ifstream(输入文件流):用于读取文件数据。
  • ofstream(输出文件流):用于向文件写入数据。
  • fstream(文件流):支持同时进行文件的读取和写入操作。

3. 打开文件

在文件操作之前,首先需要打开文件。可以使用构造函数或 open 方法打开文件。打开文件时可以指定文件的打开模式(例如读、写、追加等)。

打开模式

模式说明
ios::in读模式(默认值,仅限于 ifstream
ios::out写模式(默认值,仅限于 ofstream
ios::app追加模式,数据写入到文件末尾
ios::ate打开文件后,文件指针定位到文件末尾
ios::trunc截断模式,如果文件存在,清空文件内容
ios::binary二进制模式,以二进制方式读写
std::ifstream fin("file.txt", std::ios::in);  // 以只读模式打开
std::ofstream fout("file.txt", std::ios::out); // 以只写模式打开
std::fstream fio("file.txt", std::ios::in | std::ios::out); // 读写模式打开

💡 补充建议

为了更好地掌握文件的打开和模式,建议多尝试各种组合模式,比如同时使用 ios::in | ios::out | ios::app,观察文件的内容变化情况。


4. 检查文件是否打开成功

在打开文件后,可以通过 is_open 方法检查文件是否成功打开。若文件打开失败,应输出提示信息并进行相应处理。

std::ifstream fin("file.txt");
if (!fin.is_open()) {
    std::cerr << "无法打开文件!" << std::endl;
    return 1; // 返回错误码
}

💡 错误处理建议

建议在打开文件失败时提供更详细的错误信息,例如是否文件路径正确,是否权限足够,以帮助定位问题。


5. 写入文件

使用 ofstreamfstream 可以向文件中写入数据。写入文件类似于使用 cout 输出数据,只是目标从控制台变成了文件流对象。

#include <fstream>
#include <iostream>

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

    fout << "Hello, World!" << std::endl;
    fout << "写入文件操作示例" << std::endl;

    fout.close(); // 关闭文件
    return 0;
}

💡 提示

可以尝试使用 ofstream 的追加模式(ios::app),观察文件内容变化,理解文件指针位置的影响。


6. 读取文件

使用 ifstreamfstream 可以从文件中读取数据。读取文件类似于使用 cin 从控制台输入数据,只是源数据变成了文件。

逐行读取

使用 getline 可以逐行读取文件内容:

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

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

    std::string line;
    while (getline(fin, line)) { // 持续读取直到文件结束
        std::cout << line << std::endl; // 输出到控制台
    }

    fin.close(); // 关闭文件
    return 0;
}

💡 提示

getline() 是逐行读取的非常有用的函数,适用于读取文本文件的内容。可以尝试读取包含不同数据格式的文件,理解如何解析内容。

按单词读取

可以使用 >> 运算符按单词读取文件内容:

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

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

    std::string word;
    while (fin >> word) { // 每次读取一个单词
        std::cout << word << std::endl;
    }

    fin.close(); // 关闭文件
    return 0;
}

💡 提示

对于带有标点符号的文本,>> 运算符会将标点符号和单词分开。可以尝试使用正则表达式来更灵活地处理单词分割。


7. 文件的随机访问

在文本或二进制文件中,可以通过 seekgseekp 函数实现随机访问,分别用于输入和输出流。

  • seekg:用于设置读取位置
  • seekp:用于设置写入位置

位置参数:

参数说明
ios::beg文件开头
ios::cur当前位置
ios::end文件末尾
#include <fstream>
#include <iostream>

int main() {
    std::fstream file("example.txt", std::ios::in | std::ios::out | std::ios::trunc);
    file << "Hello, World!";
    file.seekp(0, std::ios::beg); // 设置写指针到文件开头
    file << "Hi"; // 覆盖开头的内容
    file.seekg(0); // 设置读指针到文件开头

    std::string content;
    file >> content; // 读取文件
    std::cout << content << std::endl;

    file.close();
    return 0;
}

💡 提示

随机访问文件在处理大型数据文件时非常有用,可以显著提高读取和写入的效率。


8. 二进制文件读写

文本文件中数据以文本格式存储,二进制文件中数据以原始二进制形式存储,文件体积更小,适合保存结构化数据(例如图像、音频等)。

使用 ios::binary 模式打开文件,然后使用 readwrite 进行二进制读写:

#include <fstream>
#include <iostream>

struct Data {
    int id;
    double value;
};

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

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

    return 0;
}
#include <fstream>
#include <iostream>

struct Data {
    int id;
    double value;
};

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

    fin.read(reinterpret_cast<char*>(&data), sizeof(data));
    fin.close();

    std::cout << "ID: " << data.id << ", Value: " << data.value << std::endl;

    return 0;
}

💡 提示

在使用二进制模式时,确保数据结构的对齐方式一致,以避免跨平台数据读取时可能出现的问题。


9. 关闭文件

文件操作完成后,最好使用 close 关闭文件,以释放资源。尽管文件在析构时会自动关闭,但显式关闭文件是个好习惯。

fin.close();
fout.close();

10. 文件异常处理

可以使用 try-catch 捕获文件操作中的异常,并通过检查 fail()eof()bad() 来处理文件的状态。

std::ifstream file("test.txt");
if (!file) {
    std::cerr << "文件无法打开!" << std::endl;
    return 1;
}

if (file.fail()) {
    std::cerr << "文件操作失败!" << std::endl;
}

if (file.eof()) {
    std::cout << "已达到文件末尾" << std::endl;
}

💡 提示

bad()fail() 都是检查文件状态的有用函数。bad() 检查是否发生了不可恢复的错误,而 fail() 还可以用于检测可恢复的错误。


11. 常用文件操作函数

函数名说明
open()打开文件
is_open()检查文件是否打开
close()关闭文件
write()写入二进制数据
read()读取二进制数据
put()写入单个字符
get()读取单个字符
getline()读取一行文本
seekg()设置输入指针位置
seekp()设置输出指针位置
tellg()获取当前输入指针位置
tellp()获取当前输出指针位置
eof()检查是否到达文件末尾
fail()检查文件操作是否失败
bad()检查是否发生不可恢复的错误
good()检查文件流是否正常
clear()清除文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋到亦天凉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值