当前位置: 首页 > news >正文

C++学习笔记(二十一)——文件读写

一、文件读写

作用:
文件读写指的是将数据从程序存储到文件,或从文件读取数据,以实现数据的持久化存储
C++ 提供了 fstream 头文件,用于文件操作,主要包括:

  • ofstream(输出文件流)—— 向文件写入数据
  • ifstream(输入文件流)—— 从文件读取数据
  • fstream(文件流)—— 同时支持读写

应用场景:

  • 配置文件(保存程序设置)
  • 日志系统(记录程序运行状态)
  • 数据存储(存储用户数据、序列化对象)

二、C++ 文件操作库

头文件#include <fstream>

(1)主要类:

作用
ofstream写文件
ifstream读文件
fstream读写文件

(2)文件打开模式(open()mode 参数)

模式作用
ios::in只读方式打开文件(文件必须存在)
ios::out写入方式打开文件(文件不存在会创建,存在则清空)
ios::app追加方式打开文件(数据追加到文件末尾)
ios::binary二进制模式打开文件
ios::ate打开文件并移动到文件末尾
ios::trunc清空文件内容(默认行为)

(3)文件读写方法

操作方法
写入文件ofstream<<write()
读取文件ifstream>>getline()read()
读写文件fstream<<>>seekg()
文本文件ifstream/ofstream逐行读写
二进制文件ifstream/ofstream + ios::binarywrite()read()

注意:

  • 文本文件: getline() 逐行读取;
  • 二进制文件: read()/write() 提高性能;
  • fstream 用于同时读写,避免频繁打开关闭文件。

(4)文件状态检查函数

文件状态检查函数,返回值是一个布尔值

函数名作用
good()文件流是否处于正常状态,没有遇到任何错误或异常
fail()是否发生格式错误或输入/输出操作失败(但不包括 badbit)
eof()是否读取操作到达文件末尾
bad()是否发生了严重错误,如磁盘损坏、系统错误等

三、写入文件(ofstream

示例1——向文件写入数据

#include <iostream>
using namespace std;
#include <fstream>

int main() {
    ofstream outFile("test.txt");  // 创建并打开文件

    if (!outFile)
    {
        cout << "文件打开失败!" << endl;
        return -1;
    }

    outFile << "Hello, C++ 文件操作!" << endl;
    outFile << "写入第二行数据" << endl;
    outFile.close();  // 关闭文件

    cout << "数据已写入 test.txt" << endl;

    system("pause");
    return 0;
}

注意:

  • ofstream outFile("test.txt"):创建/打开 test.txt,默认清空文件
  • outFile << "内容"向文件写入数据
  • outFile.close()关闭文件,释放资源。

示例2——追加模式写入文件

#include <iostream>
using namespace std;
#include <fstream>

int main() {
    ofstream outFile("test.txt", ios::app);  // 追加模式

    outFile << "追加数据 1" << endl;
    outFile << "追加数据 2" << endl;

    outFile.close();

    system("pause");
    return 0;
}

注意:

  • ios::app 追加模式,不会清空文件,而是在末尾追加数据

四、 读取文件(ifstream

示例1——逐行读取文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>

int main() {
    ifstream inFile("test.txt");  // 打开文件

    if (!inFile)
    {
        cout << "文件打开失败!" << endl;
        return -1;
    }

    string line;
    while (getline(inFile, line)) // 逐行读取
    {
        cout << line << endl;
    }

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

    system("pause");
    return 0;
}

注意:

  • getline(inFile, line) 逐行读取文件内容,存入 line 变量。

示例2——逐个字符读取文件

#include <iostream>
using namespace std;
#include <fstream>

int main() {
    ifstream inFile("test.txt"); // 打开文件

    if (!inFile)
    {
        cout << "文件打开失败!" << endl;
        return -1;
    }

    char ch;
    while (inFile.get(ch)) // 逐个字符读取
    {
        cout << ch;
    }

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

    system("pause");
    return 0;
}

注意:

  • 适用于逐个字符解析文件,如读取二进制文件处理格式化文本

五、读写文件(fstream

示例——同时读写文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>

int main() {
    fstream file("data.txt", ios::in | ios::out | ios::app);  // 读写+追加

    if (!file)
    {
        cout << "文件打开失败!" << endl;
        return -1;
    }

    file << "新数据写入" << endl;

    file.seekg(0);  // 移动到文件开头
    string line;
    while (getline(file, line))
    {
        cout << line << endl;
    }

    file.close(); // 关闭文件

    system("pause");
    return 0;
}

注意:

  • fstream 同时支持读写ios::in | ios::out 使得文件可读可写。
  • seekg(0)读指针移到文件开头,确保读取最新内容。

六、特殊用法

(1)处理二进制文件

示例1——写入二进制文件

#include <iostream>
using namespace std;
#include <fstream>

struct Person 
{
    char name[20];
    int age;
};

int main() {
    ofstream outFile("person.dat", ios::binary); // 创建并打开二进制文件

    Person p1 = { "Alice", 25};
    outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 写入二进制数据

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

    system("pause");
    return 0;
}

注意:

  • ios::binary 以二进制模式打开文件
  • write(reinterpret_cast<char*>(&p1), sizeof(p1)) 将结构体写入文件

示例2——读取二进制文件

#include <iostream>
using namespace std;
#include <fstream>

struct Person
{
    char name[20];
    int age;
};

int main() {
    ifstream inFile("person.dat", ios::binary); // 打开二进制文件

    Person p;
    inFile.read(reinterpret_cast<char*>(&p), sizeof(p));  // 读取二进制数据

    cout << "姓名: " << p.name << ", 年龄: " << p.age << endl;
    inFile.close(); // 关闭文件

    system("pause");
    return 0;
}

注意:

  • 适用于存储复杂数据结构(如 struct)。
  • 文件大小更小,读取速度更快

(2) 检查文件流的状态

作用:
good() 是 C++ 中std::ifstreamstd::ofstreamstd::fstream文件流类提供的成员函数之一。它可以检查文件流的状态,判断是否处于“良好”状态,即文件流没有遇到任何错误或异常情况。

示例:

#include <iostream>
using namespace std;
#include <fstream>

int main()
{
    ifstream file("test.txt");

    if (file.good())
    {
        cout << "文件可以正常读取!" << std::endl;
    }
    else
    {
        cout << "文件不可读!可能不存在或发生了错误!" << std::endl;
    }

    file.close(); // 关闭文件

    system("pause");
    return 0;
}

(3) 获取文件大小

作用:

  • tellg() 是 C++ 中 std::ifstream(输入文件流)的成员函数,用于获取当前文件读取位置的指针(文件指针),即读取操作即将在文件中的哪个字节位置执行
  • tellg() 常与 seekg() 结合使用,以计算文件大小

示例:

#include <iostream>
using namespace std;
#include <fstream>

struct Person
{
    char name[20];
    int age;
};

int main()
{
    ofstream outFile("person.dat", ios::binary); // 创建并打开二进制文件

    Person p1 = { "Alice", 25 };
    outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 写入二进制数据

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

    ifstream file("person.dat", ios::binary); // 打开二进制文件

    file.seekg(0, ios::end);  // 将指针移动到文件末尾
    streampos fileSize = file.tellg();  // 获取当前位置,即文件大小
    cout << "文件大小: " << fileSize << " 字节" << std::endl;

    file.close();

    system("pause");
    return 0;
}

相关文章:

  • 蓝桥杯 阶乘约数
  • 使用matlab求伴随矩阵
  • 图像处理篇:图像预处理——从数据到模型的桥梁
  • SSH反向隧道
  • 2025年渗透测试面试题总结-某四字大厂面试复盘 一面(题目+回答)
  • 【AI学习从零至壹】Pytorch神经⽹络
  • RAGFlow部署与使用(开源本地知识库管理系统,包括kibana配置)
  • 消息队列导致数据库数据读取不一致解决方案
  • 【协作开发】低成本一键复刻github的gitea
  • Leetcode 3483. Unique 3-Digit Even Numbers
  • 第四十八篇——数学和其它学科:为什么数学是更底层的工具?
  • Chrome 调试器第二次连接不上?
  • 关闭Windows更新
  • Vue3 + Element Plus 图片加载优化全攻略
  • 为什么选择 Rust 和 WebAssembly?
  • vue-router实现
  • C/C++中应用程序调用其他dll模块,想要使用vs调试这个dll里的代码,附加进程的方式无法命中断点,但通过调试启动的方式却可以,是什么原因?
  • Appium使用文档
  • GaussDB备份数据常用命令
  • Cortical Labs公司CL1人脑芯片:开启生物智能计算新时代
  • AI世界的年轻人,如何作答未来
  • 视频丨中国海警位中国黄岩岛领海及周边区域执法巡查
  • 滨江集团:一季度营收225.07亿元,净利润9.75亿元
  • 买新房可申领学位,广州南沙出台购房入学政策
  • 河北:开展领导干部任性用权等形式主义官僚主义问题专项整治
  • 西班牙葡萄牙突发全国大停电,欧洲近年来最严重停电事故何以酿成