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

C++中IO文件输入输出知识详解和注意事项

以下内容将从文件流类体系打开模式文本与二进制 I/O随机访问错误处理性能优化等方面,详解 C++ 中文件输入输出的使用要点,并配以示例。


一、文件流类体系

C++ 标准库提供三种文件流类型,均定义在 <fstream> 中:

  • std::ifstream:输入文件流,用于从文件读取(继承自 std::istream)。
  • std::ofstream:输出文件流,用于向文件写入(继承自 std::ostream)。
  • std::fstream:读写文件流,可同时做输入和输出(继承自两者)。

它们的典型用法与标准流 (cin/cout) 类似,但需要先打开文件。


二、打开模式(std::ios_base::openmode

打开时可指定下列模式的按位或(|)组合:

模式含义
std::ios::in打开用于读操作
std::ios::out打开用于写操作
std::ios::app所有写操作均追加到文件末尾
std::ios::trunc打开时清空已有内容(默认对 ofstream 生效)
std::ios::binary二进制模式(屏蔽文本模式下的换行转换)
std::ios::ate打开后立即定位到文件末尾

示例:

std::ifstream fin("data.txt", std::ios::in);
std::ofstream fout("out.txt", std::ios::out | std::ios::trunc);
std::fstream fs("db.bin", std::ios::in|std::ios::out|std::ios::binary);

三、文本文件 I/O

1. 写入文本

  • operator<< 与格式化

    std::ofstream fout("log.txt");
    fout << "Count = " << count << '\n';
    
  • std::endl'\n'

    • std::endl 会插入换行并刷新缓冲,频繁使用有性能开销;推荐输出 '\n'

2. 读取文本

  • 按词/按行读取

    std::ifstream fin("data.txt");
    std::string word;
    while (fin >> word) { /* 按空白分隔 */ }fin.clear(); fin.seekg(0);
    std::string line;
    while (std::getline(fin, line)) { /* 读取整行,不含换行符 */ }
    
  • 混合 >>getline
    使用 >> 后会留下换行符,若紧接 getline,会读入一个空行。
    解决:每次切换前调用 fin.ignore() 跳过残留的 '\n'


四、二进制文件 I/O

当读写原始字节或 POD 结构时,选用二进制模式并使用 read/write

struct Record { int id; double value; };void writeRecords(const std::vector<Record>& recs) {std::ofstream fout("rec.bin", std::ios::out|std::ios::binary);fout.write(reinterpret_cast<const char*>(recs.data()),recs.size()*sizeof(Record));
}std::vector<Record> readRecords() {std::ifstream fin("rec.bin", std::ios::in|std::ios::binary);fin.seekg(0, std::ios::end);std::size_t size = fin.tellg() / sizeof(Record);fin.seekg(0, std::ios::beg);std::vector<Record> recs(size);fin.read(reinterpret_cast<char*>(recs.data()),size*sizeof(Record));return recs;
}
  • 注意:直接写整体 vector 只对标准布局(POD)类型安全。若含指针或非平凡类型,需循环写每个字段或序列化。

五、随机访问(定位)

  • seekg / seekp:设置读/写位置

    fin.seekg(offset, std::ios::beg|std::ios::cur|std::ios::end);
    fout.seekp(...);
    
  • tellg / tellp:返回当前位置

    auto pos = fin.tellg();
    
  • 注意:文本模式下各种平台会对换行做转换,seek/tell 不保证以字节为单位精确跳转;二进制模式下则如你所见。


六、错误处理与异常

1. 状态位检查

if (!fin) { /* 打开失败或已处于错误状态 */ }
if (fin.eof()) { /* 到达末尾 */ }
if (fin.fail()) { /* 格式错误或开关失败 */ }

2. 异常模式

fin.exceptions(std::ios::failbit | std::ios::badbit);
try {int x;fin >> x;  // 失败时抛 std::ios_base::failure
} catch (const std::ios_base::failure& e) {std::cerr << "I/O 异常: " << e.what() << "\n";
}

3. 资源管理

  • 文件流析构时会自动 close(),但若需提前关闭或检测错误,可显式:

    fin.close();
    if (fin.fail()) std::cerr<<"关闭失败\n";
    

七、性能优化

  1. 同步关闭

    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    

    可加速与 C 风格 I/O 的混用场景。

  2. 缓冲区大小

    • 默认缓冲区通常足够;若需高性能可自定义:重载流的 rdbuf()->pubsetbuf()
  3. 减少临时与拷贝

    • 尽量一次性 read/write 大块数据;
    • 对文本分词解析可用 std::string_viewstd::getline 配合 std::stringstream
  4. 避免频繁开关文件

    • 对同一文件的多次写入,宜在同一流对象上完成;若交替读写,用 fstream 且调用 seek/flush 而非反复构造流。

八、综合示例

#include <iostream>
#include <fstream>
#include <vector>
#include <string>struct Record { int id; double value; };int main() {// 1. 文本写入{std::ofstream log("app.log", std::ios::out|std::ios::app);if (!log) throw std::runtime_error("无法打开日志");log << "程序启动\n";}// 2. 文本读取与解析{std::ifstream fin("config.txt");if (!fin) {std::cerr<<"配置文件打开失败\n";} else {std::string line;while (std::getline(fin, line)) {// 跳过空行和注释if (line.empty() || line[0]=='#') continue;std::cout<<"配置: "<<line<<"\n";}}}// 3. 二进制读写std::vector<Record> recs = {{1,1.23},{2,4.56},{3,7.89}};{std::ofstream fout("data.bin", std::ios::out|std::ios::binary);fout.write(reinterpret_cast<const char*>(recs.data()),recs.size()*sizeof(Record));}{std::ifstream fin("data.bin", std::ios::in|std::ios::binary);fin.seekg(0, std::ios::end);size_t n = fin.tellg()/sizeof(Record);fin.seekg(0);std::vector<Record> buf(n);fin.read(reinterpret_cast<char*>(buf.data()), n*sizeof(Record));std::cout<<"读取 "<<buf.size()<<" 条记录\n";}return 0;
}

九、注意事项汇总

  1. 选择合适模式:文本 vs 二进制;是否截断或追加。
  2. 检查流状态:打开后、读写后、关闭后都应检查 fail() / bad() / eof()
  3. 混合读写:使用 std::fstream 并在切换前调用 flush() / seekg() / seekp()
  4. 异常安全:开启异常模式或自行检测,避免未捕获错误导致数据不一致。
  5. 平台差异:文本模式下换行转换、字符编码(如 Windows 的 CRLF)可能影响跨平台行为。

相关文章:

C++中IO文件输入输出知识详解和注意事项

以下内容将从文件流类体系、打开模式、文本与二进制 I/O、随机访问、错误处理、性能优化等方面&#xff0c;详解 C 中文件输入输出的使用要点&#xff0c;并配以示例。 一、文件流类体系 C 标准库提供三种文件流类型&#xff0c;均定义在 <fstream> 中&#xff1a; std…...

centos7.6阿里云镜像各个版本介绍

&#xff08;水一期&#xff09; Index of /centos-vault/centos/7.6.1810/isos/x86_64/ File NameFile SizeDateParent directory/--0_README.txt2.4 KB2018-12-01 21:21CentOS-7-x86_64-DVD-1810.iso4.3 GB2018-11-26 07:55CentOS-7-x86_64-DVD-1810.torrent86.0 KB2018-12-…...

InnoDB引擎逻辑存储结构及架构

简化理解版 想象 InnoDB 是一个高效运转的仓库&#xff1a; 核心内存区 (大脑 & 高速缓存 - 干活超快的地方) 缓冲池 Buffer Pool (最最核心&#xff01;)&#xff1a; 作用&#xff1a; 相当于仓库的“高频货架”。把最常用的数据&#xff08;表数据、索引&#xff09;从…...

KVM——CPU独占

文章目录 机器现况信息配置CPU独占(pin)启用 CPU 独占&#xff08;隔离&#xff09;验证 机器现况信息 [rootkvm-server ~]# virsh list --allId 名称 状态 --------------------------- CULinux-VM 关闭- ubuntu20.04 关闭- ubuntu24.04 关闭[roo…...

第4讲、Odoo 18 模块系统源码全解与架构深度剖析【modules】

引言 Odoo 是一款强大的开源企业资源规划&#xff08;ERP&#xff09;与客户关系管理&#xff08;CRM&#xff09;系统&#xff0c;其核心竞争力之一在于高度模块化的架构设计。模块系统不仅是 Odoo 框架的基石&#xff0c;更是实现功能灵活扩展与定制的关键。本文将结合 Odoo…...

pytorch简单线性回归模型

模型五步走 1、获取数据 1. 数据预处理 2.归一化 3.转换为张量 2、定义模型 3、定义损失函数和优化器 4、模型训练 5、模型评估和调优 调优方法 6、可视化&#xff08;可选&#xff09; 示例代码 import torch import torch.nn as nn import numpy as np import matplot…...

在 HTML 文件中添加图片的常用方法

本文详解HTML图片插入方法&#xff1a;1&#xff09;通过<img>标签实现&#xff0c;必须含src和alt属性&#xff1b;2&#xff09;路径支持绝对/相对引用&#xff1b;3&#xff09;建议设置width/height保持比例&#xff1b;4&#xff09;响应式方案用srcset适配不同设备…...

四、web安全-行业术语

1. 肉鸡 所谓“肉鸡”是一种很形象的比喻&#xff0c;比喻那些可以随意被我们控制的电脑&#xff0c;对方可以是WINDOWS系统&#xff0c;也可以是UNIX/LINUX系统&#xff0c;可以是普通的个人电脑&#xff0c;也可以是大型的服务器&#xff0c;我们可以象操作自己的电脑那样来…...

Kafka核心技术解析与最佳实践指南

Apache Kafka作为分布式流处理平台的核心组件&#xff0c;以其高吞吐、低延迟和可扩展性成为现代数据架构的基石。本文基于Kafka官方文档&#xff0c;深度解析其核心技术原理&#xff0c;并结合实践经验总结关键技巧与最佳实践。 Kafka的高性能源于其精巧的架构设计&#xff0…...

Unity基础学习(十二)Unity 物理系统之范围检测

目录 一、关于范围检测的主要API&#xff1a; 1. 盒状范围检测 Physics.OverlapBox 2. 球形范围检测 Physics.OverlapSphere 3. 胶囊范围检测 Physics.OverlapCapsule 4. 盒状检测 NonAlloc 版 5. 球形检测 NonAlloc 版 6. 胶囊检测 NonAlloc 版 二、关于API中的两个重…...

JVM 的垃圾回收机制 GC

C/C 这样的编程语言中,申请内存的时候,是需要用完了,进行手动释放的 C 申请内存 1)局部变量(不需要手动释放) 2)全局变量(不需要手动释放) 3)动态申请 malloc(通过 free 进行释放的) C 申请内存 1)局部变量 2)全局变量/静态变量 3)动态申请 new 通过 delete 进行释放 …...

TypeScript 针对 iOS 不支持 JIT 的优化策略总结

# **TypeScript 针对 iOS 不支持 JIT 的优化策略总结** 由于 iOS 的 **JavaScriptCore (JSC)** 引擎 **禁用 JIT&#xff08;Just-In-Time 编译&#xff09;**&#xff0c;JavaScript 在 iOS 上的执行性能较差&#xff0c;尤其是涉及动态代码时。 **TypeScript&#xff08;T…...

00 QEMU源码中文注释与架构讲解

QEMU源码中文注释与架构讲解 先占坑&#xff1a;等后续完善后再更新此文章 注释作者将狼才鲸创建日期2025-05-30更新日期NULL CSDN阅读地址&#xff1a;00 QEMU源码中文注释与架构讲解Gitee源码仓库地址&#xff1a;才鲸嵌入式/qemu 一、前言 参考网址 QEMU 源码目录简介qe…...

ansible template 文件中如果包含{{}} 等非ansible 变量处理

在 Ansible 模板中&#xff0c;如果你的 Python 脚本里有大量 {}、f""、或者其他 Jinja 会误解析的语法&#xff0c;就需要用 {% raw %}…{% endraw %} 把它们包起来&#xff0c;只在需要替换变量的那一行单独“放行”。例如&#xff1a; {% raw %} #!/usr/bin/env …...

Screen 连接远程服务器(Ubuntu)

连接 1. 安装screen 默认预安装&#xff0c;可以通过命令查看&#xff1a; screen --version 若未安装&#xff1a; # Ubuntu/Debian sudo apt-get install screen 2. 本机连接远程服务器 ssh root192.168.x.x 在远程服务器中打开screen&#xff1a; screen -S <nam…...

路由器、网关和光猫三种设备有啥区别?

无论是家中Wi-Fi信号的覆盖&#xff0c;还是企业网络的高效运行&#xff0c;路由器、网关和光猫这些设备都扮演着不可或缺的角色。然而&#xff0c;对于大多数人来说&#xff0c;这三者的功能和区别却像一团迷雾&#xff0c;似懂非懂。你是否曾疑惑&#xff0c;为什么家里需要光…...

vscode实时预览编辑markdown

vscode实时预览编辑markdown 点击vsode界面&#xff0c;实现快捷键如下&#xff1a; 按下快捷键 CtrlShiftV&#xff08;Windows/Linux&#xff09;或 CommandShiftV&#xff08;Mac&#xff09;即可在侧边栏打开 Markdown 预览。 效果如下&#xff1a;...

2505软考高项第一、二批真题终极汇总

第一批2025.05综合题&#xff08;75道选择题&#xff09; 1、2025 年中央一号文件对进一步深化农村改革的各项任务作出全面部署。“推进农业科技力量协同攻关”的相关措施不包括()。 A.强化农业科研资源力量统筹&#xff0c;培育农业科技领军企业 B.发挥农业科研平台作用&…...

云原生安全基础:Linux 文件权限管理详解

&#x1f525;「炎码工坊」技术弹药已装填&#xff01; 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 在云原生环境中&#xff0c;Linux 文件权限管理是保障系统安全的核心技能之一。无论是容器化应用、微服务架构还是基础设施即代码&#xff08;IaC&#xf…...

A类地址中最小网络号(0.x.x.x) 默认路由 / 无效/未指定地址

A类地址中最小网络号&#xff08;0.x.x.x&#xff09;为何不指派&#xff1f; 在IPv4的A类地址中&#xff0c;网络号范围为 0.0.0.0 ~ 127.0.0.0&#xff0c;但网络号0&#xff08;即0.x.x.x&#xff09; 通常不被指派给任何网络&#xff0c;原因如下&#xff1a; 1. 0.x.x.x …...

[嵌入式实验]实验二:LED控制

一、实验目的 1.熟悉开发环境 2.控制LED灯 二、实验环境 硬件&#xff1a;STM32开发板、CMSIS-DAP调试工具 软件&#xff1a;ARM的IDE&#xff1a;Keil C51 三、实验内容 1.实验原理 &#xff08;1&#xff09;LED灯原理与点亮 LED即发光二极管&#xff0c;有电流通过…...

6.4.2_3最短路径问题_Floyd算法

Floyd弗洛伊德 膜拜大佬&#xff0c;给大佬鞠躬鞠躬鞠躬。。。。。。。。。 Floyd算法 ----解决顶点间的最短路径&#xff1a; 过程&#xff1a; 如下&#xff1a; 初始化(没有中转点)&#xff1a;2个邻接矩阵A和path&#xff0c;第一个是没有中转点的2个顶点之间的最短路径…...

<PLC><socket><西门子>基于西门子S7-1200PLC,实现手机与PLC通讯(通过websocket转接)

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…...

day 33 python打卡

作业&#xff1a;今日的代码&#xff0c;要做到能够手敲。这已经是最简单最基础的版本了。 import torch print(torch.__version__) print(torch.version.cuda) print(torch.cuda.is_available()) import torch# 检查CUDA是否可用 if torch.cuda.is_available():print("CU…...

开发时如何通过Service暴露应用?ClusterIP、NodePort和LoadBalancer类型的使用场景分别是什么?

一、Service核心概念 Service通过标签选择器&#xff08;Label Selector&#xff09;关联Pod&#xff0c;为动态变化的Pod集合提供稳定的虚拟IP和DNS名称&#xff0c;主要解决&#xff1a; 服务发现负载均衡流量路由 二、Service类型详解 1. ClusterIP&#xff08;默认类型…...

【机械视觉】Halcon—【六、交集并集差集和仿射变换】

【机械视觉】Halcon—【六、交集并集差集和仿射变换】 目录 【机械视觉】Halcon—【六、交集并集差集和仿射变换】 介绍 交集并集差集介绍: 1. 交集&#xff08;Intersection&#xff09; 2. 并集&#xff08;Union&#xff09; 3. 差集&#xff08;Difference&#xff…...

深度学习核心网络架构详解(续):从 Transformers 到生成模型

在上一篇文章中&#xff0c;我们详细介绍了卷积神经网络 (CNN)、循环神经网络 (RNN) 及其变体 LSTM 和 GRU。本文将继续探讨其他必须掌握的深度学习网络架构&#xff0c;包括 Transformers、生成对抗网络 (GAN)、自编码器 (Autoencoder) 以及强化学习基础。我们将深入讲解这些技…...

AI智能混剪视频大模型开发方案:从文字到视频的自动化生成·优雅草卓伊凡

AI智能混剪视频大模型开发方案&#xff1a;从文字到视频的自动化生成优雅草卓伊凡 引言&#xff1a;AI视频创作的未来已来 近年来&#xff0c;随着多模态大模型&#xff08;如Stable Diffusion、Sora、GPT-4&#xff09;的爆发式发展&#xff0c;AI已经能够实现从文字生成图像…...

allWebPlugin中间件VLC专用版之截图功能介绍

背景 VLC控件原有接口具有视频截图方法&#xff0c;即video对象的takeSnapshot方法&#xff0c;但是该方法返回的是一个IPicture对象&#xff0c;不适合在谷歌等现代浏览器上使用。因此&#xff0c;本人增加一个新的视频截图方法takeSnapshot2B64方法&#xff0c;直接将视频截图…...

【JavaSE】异常处理学习笔记

异常处理 -异常介绍 基本概念 Java语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”。&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; 执行过程中所发生的异常事件可分为两类 Error&#xff08;错误&#xff09;&#xff1a;Java虚拟机无法解决…...