C++ 中文件 IO 操作详解

在C++中,文件操作是通过流(stream)来实现的。标准库提供了三种主要的文件流类来处理文件IO操作:

  • ofstream:用于写入文件(output file stream)
  • ifstream:用于读取文件(input file stream)
  • fstream:用于读写文件(file stream)

这些类都继承自C++标准库中的流基类,提供了统一的接口来操作文件。

一、文件流类的基本使用

打开文件

打开文件是进行文件操作的第一步。每个流类都提供了open()方法,也可以在构造函数中直接指定文件名:

#include <fstream>// 使用构造函数打开文件
std::ofstream outFile("example.txt");  // 写入模式
std::ifstream inFile("example.txt");   // 读取模式
std::fstream ioFile("example.txt", std::ios::in | std::ios::out);  // 读写模式// 或者使用open()方法
std::ofstream outFile2;
outFile2.open("example.txt");
文件打开模式

文件打开模式可以通过位操作符|组合使用:

  • std::ios::in:读取模式
  • std::ios::out:写入模式(默认会截断文件)
  • std::ios::app:追加模式
  • std::ios::ate:打开后定位到文件末尾
  • std::ios::trunc:打开时截断文件(删除原有内容)
  • std::ios::binary:二进制模式
检查文件是否成功打开

在进行文件操作前,应该检查文件是否成功打开:

if (!outFile.is_open()) {std::cerr << "无法打开文件!" << std::endl;return 1;
}// 或者更简洁的方式
if (!outFile) {std::cerr << "文件打开失败!" << std::endl;return 1;
}

二、写入文件(ofstream)

ofstream类用于向文件写入数据,它继承了ostream的功能,因此可以使用<<操作符:

#include <fstream>
#include <iostream>int main() {// 创建并打开文件std::ofstream outFile("data.txt");if (outFile.is_open()) {// 写入文本数据outFile << "Hello, World!" << std::endl;outFile << "这是一个测试文件。" << std::endl;// 写入数值数据int number = 42;double pi = 3.14159;outFile << "Number: " << number << ", Pi: " << pi << std::endl;// 写入自定义数据std::string name = "Doubao";outFile << "Name: " << name << std::endl;// 关闭文件outFile.close();std::cout << "文件写入成功!" << std::endl;} else {std::cerr << "无法打开文件进行写入!" << std::endl;}return 0;
}

三、读取文件(ifstream)

ifstream类用于从文件读取数据,它继承了istream的功能,因此可以使用>>操作符或getline()方法:

#include <fstream>
#include <iostream>
#include <string>int main() {// 打开文件std::ifstream inFile("data.txt");if (inFile.is_open()) {// 逐行读取std::string line;while (std::getline(inFile, line)) {std::cout << line << std::endl;}// 关闭文件inFile.close();} else {std::cerr << "无法打开文件进行读取!" << std::endl;}return 0;
}
读取不同类型的数据
#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream inFile("data.txt");if (inFile.is_open()) {// 读取字符串std::string text;inFile >> text;std::cout << "读取的文本: " << text << std::endl;// 读取整数int number;inFile >> number;std::cout << "读取的整数: " << number << std::endl;// 读取浮点数double pi;inFile >> pi;std::cout << "读取的浮点数: " << pi << std::endl;// 读取整行(包括空格)std::string fullLine;std::getline(inFile, fullLine);  // 清除缓冲区中的换行符std::getline(inFile, fullLine);std::cout << "读取的整行: " << fullLine << std::endl;inFile.close();}return 0;
}

四、读写文件(fstream)

fstream类结合了ifstreamofstream的功能,可以同时进行读写操作:

#include <fstream>
#include <iostream>
#include <string>int main() {// 打开文件进行读写,不截断std::fstream ioFile("data.txt", std::ios::in | std::ios::out);if (ioFile.is_open()) {// 读取现有内容std::string content;std::getline(ioFile, content);std::cout << "读取的内容: " << content << std::endl;// 定位到文件末尾进行追加ioFile.seekp(0, std::ios::end);ioFile << "这是追加的内容" << std::endl;// 定位到文件开头重新读取ioFile.seekg(0, std::ios::beg);while (std::getline(ioFile, content)) {std::cout << content << std::endl;}ioFile.close();}return 0;
}

五、文件定位和状态检查

文件定位

可以使用以下方法控制文件指针位置:

  • tellg():返回输入位置
  • tellp():返回输出位置
  • seekg():设置输入位置
  • seekp():设置输出位置
状态检查

流状态可以通过以下方法检查:

  • good():检查流是否正常
  • eof():检查是否到达文件末尾
  • fail():检查是否发生非致命错误
  • bad():检查是否发生致命错误
  • clear():清除错误标志

六、二进制文件操作

对于二进制文件,需要使用std::ios::binary模式:

#include <fstream>
#include <iostream>int main() {// 写入二进制数据{std::ofstream outFile("binary.bin", std::ios::binary);int numbers[] = {1, 2, 3, 4, 5};outFile.write(reinterpret_cast<char*>(numbers), sizeof(numbers));}// 读取二进制数据{std::ifstream inFile("binary.bin", std::ios::binary);int readNumbers[5];inFile.read(reinterpret_cast<char*>(readNumbers), sizeof(readNumbers));for (int i = 0; i < 5; ++i) {std::cout << readNumbers[i] << " ";}std::cout << std::endl;}return 0;
}

七、文件操作的最佳实践

  1. 始终检查文件是否成功打开
  2. 使用RAII原则(资源获取即初始化)管理文件资源
  3. 明确指定文件打开模式
  4. 对于大文件,考虑分块读取或写入
  5. 处理可能的异常情况
  6. 使用std::endl会刷新缓冲区,如需提高性能可使用\n
  7. 对于二进制文件,使用read()write()方法

通过掌握这些文件IO操作,可以在C++中有效地处理各种文件读写任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第32节 Node.js 全局对象

在Node.js中我们可以直接访问到全局对象。 这些对象在所有模块里都是可用的&#xff0c;有些对象不是在全局作用域而是在模块作用域里&#xff0c;这些情况将在本文的内容中进行介绍。 global {Object} 全局命名空间对象。 在浏览器中&#xff0c;全局作用域就是顶级域。如…

Linux文件属性和权限概述-linux026

Linux文件属性和权限概述 Linux 系统作为多用户操作系统&#xff0c;通过文件属性和权限机制来控制不同用户对文件和目录的访问&#xff0c;从而保证系统的安全性。不同的用户对同一文件可以有不同的访问权限&#xff0c;这些权限包括 读取&#xff08;read&#xff09;、写入…

nuScenes介绍

目标检测指标 指标内容mAP&#xff08;mean Average Precision&#xff09;bev下2d中心点的距离来评价&#xff0c;而不是像2d检测里用iou来评价mATE&#xff08;Average Translation Error&#xff09;中心点的2D欧式距离mASE&#xff08;Average Scale Error&#xff09;中心…

带中断计数器的UART接收中断程序 (8259@400H/402H)

1.程序功能 在中断服务程序中增加了中断计数器&#xff0c;并在主循环中通过串口输出中断次数。 2.验证 2.1手动触发8259的IR1&#xff0c;高电平有效 2.2串口接收 3.测试程序 ; You may customize this and other start-up templates; ; The location of this template is…

在Postgresql中跟踪SQL语句

文章说明 本文主要说明如何在Postgresql中跟踪实际执行的SQL语句。 本文内容有如下应用场景&#xff1a; 在系统中执行了一系列的操作&#xff0c;需要将这些操作转化成SQL在正式环境上一次性执行&#xff0c;省下重新执行一遍的操作时间。最近系统数据被人或被程序修改导致…

【信创-k8s】重磅-鲲鹏arm+麒麟V10离线部署k8s1.30+kubesphere4.1.3

随着信创产业的推进&#xff0c;鲲鹏arm64架构得以快速发展。而由于信创领域的主要客户通常部署在内网环境中&#xff0c;这使得离线部署成为该架构方案实施过程中不可或缺的关键环节。 **环境涉及软件版本信息** 服务器芯片: **鲲鹏920/飞腾2000(arm64)** 操作系统&#xff…

第11章:Neo4j实际应用案例

理论知识和技术细节固然重要&#xff0c;但真正理解Neo4j的价值在于了解它如何解决实际业务问题。本章将探讨Neo4j在各个领域的实际应用案例&#xff0c;包括社交网络分析、推荐系统、知识图谱以及欺诈检测与安全分析。通过这些案例&#xff0c;读者可以了解如何将前面章节学到…

数字图像处理与OpenCV初探

什么是数字图像处理&#xff1f; 当今时代&#xff0c;数字图像无处不在。手机拍照、安防监控、医疗检查、地图导航、工业质检……我们每天都在接收、分析和处理大量图像信息。对于计算机而言&#xff0c;图像并不是一张“看得懂”的照片&#xff0c;而是由数值组成的矩阵。如何…

ubuntu网络连接失败 + mobaxterm拖拽文件出错等问题解决方法

网络连接问题&#xff0c;表现在不能通过源下载以及更新 终端问题显示【通过 ip a 命令获得】 kejiubuntu:~/Desktop$ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00…

C# CS_Prj01 串口通信控制台程序

一直以来&#xff0c;玩8088单板机&#xff0c;上位机都是使用的绿色现成的串口软件。 今天&#xff0c;感觉8088单板机的各部分测试都基本完成了。 本着玩的精神&#xff0c;自己写一个上位机的简单串口程序&#xff0c;与自己的8088单板机通讯。 功能&#xff1a;一个完整…

40套精品大气黑金系列行业PPT模版分享

黑金系列PPT模版&#xff0c;优秀员工颁奖典礼PPT模版&#xff0c;消费订货会PPT模版&#xff0c;共赢未来PPT模版&#xff0c;投资类PPT模版&#xff0c;双12年终盛典PPT模版&#xff0c;商业计划书PPT模版&#xff0c;高端通用企业文化PPT模版&#xff0c;公司喜报企业捷报PP…

SAP学习笔记 - 开发31 - 前端Fiori开发 Device Adaptation(设备自适应)

上一章讲了Fiori开发中的 Responsiveness&#xff08;响应式设计&#xff09;。 SAP学习笔记 - 开发30 - 前端Fiori开发 Responsiveness&#xff08;响应式设计&#xff09;-CSDN博客 本章继续学习Fiori 开发中的知识。 目录 1&#xff0c;Device Adaptation&#xff08;设备…

网络的那些事——初级——OSPF(2)

前面说了OSPF的状态机和一起简单的OSPF配合&#xff0c;接下这章继续写OSPFV2 IP frr和OSPFV3. 什么是OSPF IP FRR? OSPF IP FRR&#xff08;Fast Reroute&#xff09;利用全网链路状态数据库&#xff0c;预先计算出备份路径保存在转发表中&#xff0c;以备在故障时提供流量保…

C++(初阶)(二十一)——unordered_set和unordered_map

二十二&#xff0c;unordered_set和unordered_map的使用 1.unordered_set 1.1介绍 c11 template<class Key,class Hash std::hash<Key>,class KeyEqual std::equal_to<Key>,class Allocator std::allocator<Key> > class unordered_set;c17 na…

Java面试题:分布式ID时钟回拨怎么处理?序列号耗尽了怎么办?

欢迎来到啾啾的博客&#x1f431;。 记录学习点滴。分享工作思考和实用技巧&#xff0c;偶尔也分享一些杂谈&#x1f4ac;。 有很多很多不足的地方&#xff0c;欢迎评论交流&#xff0c;感谢您的阅读和评论&#x1f604;。 目录 引言1 分布式ID2 问题2.1 时钟回拨2.1.1 毫秒级时…

影视剧学经典系列-梁祝-陶渊明《感士不遇赋并序》

1、背景 《感士不遇赋并序》是东晋诗人陶渊明创作的一篇抒发怀才不遇之慨的辞赋作品。受董仲舒《士不遇赋》和司马迁《悲士不遇赋》启发&#xff0c;陶渊明借古喻今&#xff0c;批判“真风告逝&#xff0c;大伪斯兴”的乱世。社会批判‌以“密网裁而鱼骇&#xff0c;宏罗制而鸟…

Spring Cloud Gateway 全面学习指南

Spring Cloud Gateway 全面学习指南 学习目录 第一部分&#xff1a;基础概念与核心架构 API网关概述与Spring Cloud Gateway简介Spring Cloud Gateway核心架构与工作原理Spring Cloud Gateway与Zuul的对比分析Spring Cloud Gateway核心组件详解 第二部分&#xff1a;基础配…

蛋白分析工具和数据库

UniProt&#xff08;Universal Protein Resource&#xff09;是一个综合性的蛋白质数据库&#xff0c;提供了全球范围内已知的蛋白质序列和功能信息。其中&#xff0c;UniProtKB&#xff08;UniProt Knowledgebase&#xff09;是最核心的组成部分&#xff0c;包含了经过注释和分…

Docker -- 快速入门

镜像与容器 当我们使用Docker安装应用时&#xff0c;Docker会自动搜索并下载应用镜像&#xff08;image&#xff09;。镜像不仅包含应用本身&#xff0c;还包含应用运行所需要的环境&#xff0c;配置、系统函数库。Docker会在运行镜像时创建一个隔离环境&#xff0c;称为容器&…

输入数量未知如何设置输入

在 C 的算法题中&#xff0c;如果你不知道输入数据有多少组&#xff08;即测试用例的数量未知&#xff09;&#xff0c;通常的处理方式是使用 循环读取输入直到文件结束 &#xff08;EOF&#xff09;。这类题目常见于在线评测系统&#xff08;如 LeetCode、牛客网、POJ 等&…