C++ 文件操作详解

C++ 文件操作详解

在C++中,文件操作分为文本文件和二进制文件的操作,通过文件流类(ifstreamofstreamfstream)进行文件的读写。这些类封装了文件的输入和输出操作,并继承了istreamostream的功能,使得流对象既可以用于标准输入输出,也可以用于文件的读写。

本文将详细讲解如何在C++中使用文件流进行文件操作,并会通过代码示例逐步说明。


一、I/O流概述

C++文件操作主要依赖以下头文件:

复制代码
#include <fstream>

C++中的文件操作主要通过以下三个类来实现:

  • ofstream :继承自ostream类,主要用于文件的写操作。
  • ifstream :继承自istream类,主要用于文件的读操作。
  • fstream :继承自ifstreamofstream类,既可用于文件的读操作,也可用于写操作。

二、文本文件的读写操作

1. 创建流对象并打开文件

在打开文件时,可以选择使用构造函数直接打开,或者创建对象后再通过open函数进行打开:

  1. 通过构造函数直接打开文件

    复制代码
    ofstream fout("filename.txt", ios::out);
  2. 先创建对象再打开文件

    复制代码
    ofstream fout;
    fout.open("filename.txt", ios::out);
文件打开模式

open函数提供多种模式控制文件的打开方式:

  • ios::app:追加模式,从文件末尾写入。

  • ios::ate:打开文件时将指针指向文件末尾。

  • ios::binary:以二进制模式打开文件。

  • ios::in:以读模式打开文件。

  • ios::out:以写模式打开文件。

  • ios::trunc:清空文件内容(文件已存在时)。

    ifstream fin("filename.txt", ios::in | ios::binary);

2. 判断文件是否成功打开

可以使用以下方式判断文件是否成功打开:

  • !对象:直接使用对象的逻辑取反判断

    if (!fin) {
    cout << "文件打开失败" << endl;
    } else {
    cout << "文件打开成功" << endl;
    }

  • good()fail():判断上一次文件操作的成功与失败。

    复制代码
    if (fin.good()) {
        cout << "上一次操作成功" << endl;
    } else {
        cout << "上一次操作失败" << endl;
    }
3. 文件的读写操作

文本文件的读写直接使用流运算符:

  • 写操作

    复制代码
    fout << "Hello, world!" << endl;
  • 读操作

    复制代码
    string line;
    fin >> line;
4. 关闭文件

关闭文件使用close()方法:

复制代码
fout.close();
示例代码:将学生类对象写入文件

我们创建一个简单的Student类并将其对象写入到文本文件中。

复制代码
#include <iostream>
#include <fstream>
using namespace std;

class Student {
private:
    string name;
    int age;

public:
    Student(string n, int a) : name(n), age(a) {}

    friend ofstream& operator<<(ofstream &out, const Student &s) {
        out << s.name << " " << s.age;
        return out;
    }
};

int main() {
    Student s("Alice", 20);
    ofstream fout("stu.txt");
    if (fout.is_open()) {
        fout << s;
        fout.close();
    }
    return 0;
}

三、随机读写操作

C++支持文件流的随机访问,即可以在文件中任意位置读写数据。主要有以下几个函数:

  • seekg:设置输入流位置。
  • seekp:设置输出流位置。
  • tellg:获取输入流当前位置。
  • tellp:获取输出流当前位置。

例如,将指针移动到文件的开头或末尾:

复制代码
fin.seekg(0, ios::beg);  // 从文件开头读取
fout.seekp(0, ios::end); // 从文件末尾写入

四、二进制文件的读写操作

1. 创建流对象并打开文件

以二进制模式打开文件时,需要添加ios::binary标志:

复制代码
fstream fs("data.bin", ios::in | ios::out | ios::binary);
2. 读写二进制文件

使用writeread函数进行二进制数据的写入和读取:

  • 写入数据

    复制代码
    int num = 100;
    fout.write(reinterpret_cast<char*>(&num), sizeof(num));
  • 读取数据

    复制代码
    int num;
    fin.read(reinterpret_cast<char*>(&num), sizeof(num));
注意事项
  • 二进制操作中,数据以字节方式读写,因此不能直接对包含指针的对象进行二进制读写,否则会导致数据不一致。
  • 可以使用eof()函数判断是否到达文件末尾。
示例代码:二进制文件的写入和读取

以下代码演示如何将一个整数以二进制方式写入文件,并读取它。

复制代码
#include <iostream>
#include <fstream>
using namespace std;

int main() {
    // 写入数据
    ofstream fout("data.bin", ios::binary);
    int num = 1234;
    fout.write(reinterpret_cast<char*>(&num), sizeof(num));
    fout.close();

    // 读取数据
    ifstream fin("data.bin", ios::binary);
    int readNum;
    fin.read(reinterpret_cast<char*>(&readNum), sizeof(readNum));
    fin.close();

    cout << "读取的数字为:" << readNum << endl;
    return 0;
}

总结

本文介绍了C++文件操作的基本方法,包括文本和二进制文件的读写操作,以及流位置指针的控制。掌握这些操作后,便可以在C++程序中高效地处理文件数据。

相关推荐
秋氘渔12 分钟前
综合案例:Python 函数知识整合 — 学生成绩管理系统
开发语言·python
我命由我1234520 分钟前
软件开发 - 避免过多的 if-else 语句(使用策略模式、使用映射表、使用枚举、使用函数式编程)
java·开发语言·javascript·设计模式·java-ee·策略模式·js
愿天堂没有C++24 分钟前
剑指offer第2版——面试题4:二维数组中的查找
c++·面试
long31629 分钟前
java 策略模式 demo
java·开发语言·后端·spring·设计模式
AI 嗯啦1 小时前
SQL详细语法教程(三)mysql的函数知识
android·开发语言·数据库·python·sql·mysql
徐归阳2 小时前
第二十四天:虚函数与纯虚函数
c++
青草地溪水旁2 小时前
UML函数原型中constraint的含义,有啥用?
c++·uml
GUET_一路向前3 小时前
【C语言】解释形参void *data用法
c语言·开发语言·通用指针
skywalk81633 小时前
转换一个python项目到moonbit,碰到报错输出:编译器对workflow.mbt文件中的类方法要求不一致的类型注解,导致无法正常编译
开发语言·moonbit·trae
汤永红3 小时前
week1-[循环嵌套]画正方形
数据结构·c++·算法