C++ 文件操作详解
C++ 文件操作详解
在C++中,文件操作分为文本文件和二进制文件的操作,通过文件流类(ifstream
、ofstream
、fstream
)进行文件的读写。这些类封装了文件的输入和输出操作,并继承了istream
和ostream
的功能,使得流对象既可以用于标准输入输出,也可以用于文件的读写。
本文将详细讲解如何在C++中使用文件流进行文件操作,并会通过代码示例逐步说明。
一、I/O流概述
C++文件操作主要依赖以下头文件:
#include <fstream>
C++中的文件操作主要通过以下三个类来实现:
ofstream
:继承自ostream
类,主要用于文件的写操作。ifstream
:继承自istream
类,主要用于文件的读操作。fstream
:继承自ifstream
和ofstream
类,既可用于文件的读操作,也可用于写操作。
二、文本文件的读写操作
1. 创建流对象并打开文件
在打开文件时,可以选择使用构造函数直接打开,或者创建对象后再通过open
函数进行打开:
-
通过构造函数直接打开文件:
ofstream fout("filename.txt", ios::out);
-
先创建对象再打开文件:
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. 读写二进制文件
使用write
和read
函数进行二进制数据的写入和读取:
-
写入数据:
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++程序中高效地处理文件数据。
相关文章:
C++ 文件操作详解
C 文件操作详解 在C中,文件操作分为文本文件和二进制文件的操作,通过文件流类(ifstream、ofstream、fstream)进行文件的读写。这些类封装了文件的输入和输出操作,并继承了istream和ostream的功能,使得流对…...

计算机网络:网络层 —— 边界网关协议 BGP
文章目录 路由选择协议动态路由协议边界网关协议 BGPBGP 的基本概念BGP-4 的四种报文 路由选择协议 因特网是全球最大的互联网,它所采取的路由选择协议具有以下三个主要特点: 自适应:因特网采用动态路由选择,能较好地适应网络状态…...

Python数据可视化seaborn
产品经理在做数据分析时可能需要通过可视化来分析。seaborn官网 1. relplot 散点图 https://seaborn.pydata.org/examples/scatterplot_sizes.html import pandas as pd import seaborn as sns df pd.DataFrame({x: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],y: [8, 6, 7, 8, 4, 6,…...
Java继承练习
构建Person类(属性:名字、年龄、工作岗位),创建三个对象,并且根据对象的年龄或名字长度来进行冒泡排序 package chapter08.homework.test01;public class homework01 {public static void main(String[] args) {Perso…...

Excel怎么转换成word?分享两种方法!
Excel文件想要转换成word文档中,直接粘贴复制的话,可能会导致表格格式错乱,那么如何转换才能够保证表格不错乱?今天分享两个方法,excel表格转换为word文件。 方法一: 首先打开excel表格,将表格…...
nignx代理获取真实地址request.getRequestURL()
# 反向代理配置到后端接口 location /prod-api/ { # proxy_set_header Host $proxy_host; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header REMOTE-HOST $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarde…...
登录注册窗口(二)
登录注册窗口(二) 前言 在上一集我们就完成了整个登录注册窗口的布局,我们为了能够点击那两个特殊的按钮,我们就要去连接他们的槽函数。那么我们就开始这一集的内容吧。 需求分析 为了能够切换手机号与用户名的注册登录以及注…...
go channel 通道
一、底层实现 1、数据结构 type hchan struct {qcount uint // total data in the queuedataqsiz uint // size of the circular queuebuf unsafe.Pointer // points to an array of dataqsiz elementselemsize uint16closed uint32timer *t…...

论文阅读:Computational Long Exposure Mobile Photography (二)
这篇文章是谷歌发表在 2023 ACM transaction on Graphic 上的一篇文章,介绍如何在手机摄影中实现长曝光的一些拍摄效果。 Abstract 长曝光摄影能拍出令人惊叹的影像,用运动模糊来呈现场景中的移动元素。它通常有两种模式,分别产生前景模糊或…...

基于SSM+小程序的高校寻物平台管理系统(失物1)
👉文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 本基于微信小程序的高校寻物平台有管理员,用户以及失主三个角色。 1、管理员功能有个人中心,用户管理,失主管理,寻物启示管理,拾…...

gerrit 搭建遇到的问题
1、启动Apache,端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…...
UBUNTU查看CPU核心数
UBUNTU查看CPU核心数 前言一、使用lscpu命令1. 执行命令2. 查看输出 二、使用/proc/cpuinfo文件1. 查看文件2. 解释输出 三、使用nproc命令1. 执行命令2. 查看输出 四、使用htop或top工具1. 使用htop2. 使用top 五、使用inxi命令1. 执行命令2. 查看输出 六、使用图形界面工具1.…...
【JS】声明提升与块级作用域
我是目录 引言声明提升声明提升的理解函数表达式声明提升总结代码生成与查找变量的过程代码生成词法分析( Tokenizing/Lexing)语法分析( Parsing)代码生成生成代码总结查找变量不同版本中的执行上下文不同版本对执行上下文的定义let/constlet特点const特点let/const声明的变…...
Flink的流、批处理
Flink的数据流处理,是持续流模型,数据不会落地,上游和下游的Task同时启动,等待数据的到达,Flink的批处理还是用的MapReduce计算模型,先处理map端,再执行reduce端。 flink的流处理(STREAMING)&a…...

学习方法该升级了,AI时代的弯道超车:【心流学习法】行动与意识合一的巅峰进化
你是否曾感到内心如荒漠般干涸,面对浩瀚的知识海洋,热情逐渐消磨殆尽? 你是否渴望忘却时间的流逝,心无旁骛,与知识展开一场纯粹而深邃的对话? 在AI时代,智能体处理数据、知识迭代的速率让人…...

【大模型LLM面试合集】大语言模型架构_chatglm系列模型
chatglm系列模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种: autoregressive自回归模型(AR模型):代表作GPT。本质上是一个left-to-right的语言模型。通常用于生成式任务,在长文本生成方面取得了巨大的成功&a…...

深入理解 Kafka:分布式消息队列的强大力量
一、引言 在现代分布式系统中,消息队列扮演着至关重要的角色,而 Kafka 作为其中的佼佼者,以其高吞吐量、可扩展性和持久性等特点被广泛应用。无论是处理海量的日志数据、实时的用户交互信息,还是复杂的微服务间通信,Ka…...

LabVIEW 离心泵机组故障诊断系统
开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法,通过远程在线监测与分析,有效提升了离心泵的预测性维护能力,保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…...
GEE土地分类——土地分类的原始remap转化原始的土地分类名称
简介 GEE土地分类——土地分类的原始remap转化原始的土地分类名称 函数 first(image2) Selects the value of the first value for each matched pair of bands in image1 and image2. If either image1 or image2 has only 1 band, then it is used against all the bands…...
一些关于云电脑与虚拟化东西
前言 好久没有更新了,在进行自我校准。 云计算是什么? 云计算是一种模型,它使得用户能够随时随地、方便地、按需访问共享的可配置计算资源池(例如,网络、服务器、存储、应用程序和服务),这些资…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

1.3 VSCode安装与环境配置
进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件,然后打开终端,进入下载文件夹,键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文全面剖析RNN核心原理,深入讲解梯度消失/爆炸问题,并通过LSTM/GRU结构实现解决方案,提供时间序列预测和文本生成…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...

MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
tomcat入门
1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效,稳定,易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...