C++ 文件操作详解

devtools/2024/11/7 15:58:52/

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++程序中高效地处理文件数据。


http://www.ppmy.cn/devtools/132050.html

相关文章

ubuntu 22.04 server 安装 anaconda3

ubuntu 22.04 server 安装 anaconda3 https://www.anaconda.com/download/success Anaconda Installers wget https://repo.anaconda.com/archive/Anaconda3-2024.10-1-Linux-x86_64.sh 其他的是 默认 Executing transaction: done installation finished. Do you wish to…

Unity网络开发基础(part5.网络协议)

目录 前言 网络协议概述 OSI模型 OSI模型的规则 第一部分 物理层 数据链路层 网络层 传输层 第二部分 ​编辑 应用层 表示层 会话层 每层的职能 TCP/IP协议 TCP/IP协议的规则 TCP/IP协议每层的职能 TCP/IP协议中的重要协议 TCP协议 三次握手 四次挥手 U…

数据转换 | Matlab基于SP符号递归图(Symbolic recurrence plots)一维数据转二维图像方法

目录 基本介绍程序设计参考资料获取方式 基本介绍 Matlab基于SP符号递归图&#xff08;Symbolic recurrence plots&#xff09;一维数据转二维图像方法 符号递归图(Symbolic recurrence plots)是一种一维时间序列转图像的技术&#xff0c;可用于平稳和非平稳数据集;对噪声具有…

Bypassuac之白名单结合注册表方式

参考 Bypass UAC 原来这么简单 本章记录一下系统白名单文件结合注册表bypassuac&#xff0c;uac这个东西并不是Windows设置的防御机制而是相当于保护机制&#xff0c;只是用来控制用户行为的&#xff0c;弹个窗来提醒一下用户的行为&#xff0c;和直接的杀软是不一样的性质&am…

AnaTraf | 网络性能监控系统保障音视频质量的秘籍

AnaTraf 网络性能监控系统NPM | 全流量回溯分析 | 网络故障排除工具 一、网络性能监控系统&#xff1a;音视频质量的幕后守护者 在当今数字化的世界里&#xff0c;音视频应用无处不在&#xff0c;无论是在线会议、远程教育还是娱乐直播。然而&#xff0c;这些流畅精彩的音视频…

WPF之iconfont(字体图标)使用

1&#xff0c;前文&#xff1a; WPF的Xaml是与前端的Html有着高度相似性的标记语言&#xff0c;所以Xaml也可同Html一般轻松使用阿里提供的海量字体图标&#xff0c;从而有效的减少开发工作度。 2&#xff0c;下载字体图标&#xff1a; 登录阿里图标库网iconfont-阿里巴巴矢量…

大学城水电资源管理:Spring Boot解决方案

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理大学城水电管理系统的相关信息成为必然。开…

【docker入门】docker的安装

目录 Centos 7 添加docker 官方仓库到yum源 将 Docker 的官方镜像源替换为国内可以的 Docker 镜像源 安装docker 配置docker加速源 Ubuntu 创建 gpg key 目录 下载 gpg key 添加国内可用镜像源到 系统的 APT 仓库中 安装docker 配置加速源 Centos 7 添加docker 官方仓…