C++中的文件操作

1、文件操作

文章目录

    • 1、文件操作
      • 1.读写TXT文件
        • 1.写文件
        • 2.读文件
        • 3.读文件的方式
        • 4.注意事项
      • 2.读写二进制文件
        • 1.写入二进制文件
        • 2.读取二进制文件
        • 3.注意事项

1.读写TXT文件

在C++中,读取和写入文件通常涉及到使用<fstream>库中的类,主要是ifstream(用于读取)、ofstream(用于写入)和fstream(既能读又能写)。下面我将分别说明如何进行文件的读取和写入操作。

1.写文件

要向文件写入内容,你需要创建一个ofstream对象,并打开一个文件。如果文件不存在,它会被创建;如果存在,则会被覆盖。

#include <fstream>
#include <iostream>
#include <string>int main() {std::string filename = "example.txt";std::ofstream outFile(filename);if (!outFile) { // 检查是否成功打开文件std::cerr << "无法打开文件 " << filename << std::endl;return 1;}outFile << "Hello, World!" << std::endl; // 写入文本outFile << "这是另一行内容。" << std::endl;outFile.close(); // 关闭文件std::cout << "内容已成功写入文件 " << filename << std::endl;return 0;
}//
// Created by 86189 on 2024/6/19.
//
#include <iostream>
#include <fstream>
using namespace std;int main() {ofstream outFile;outFile.open("test.txt", ios::out);if (!outFile) {cout << "文件打开失败" << endl;return 0;}outFile << "Hello World!" << endl;outFile.close();return 0;
}
2.读文件

读取文件时,你可以使用ifstream对象。下面的示例展示了如何逐行读取文件内容。

#include <fstream>
#include <iostream>
#include <string>int main() {std::string filename = "example.txt";std::ifstream inFile(filename);if (!inFile) { // 检查是否成功打开文件std::cerr << "无法打开文件 " << filename << std::endl;return 1;}std::string line;while (std::getline(inFile, line)) { // 逐行读取std::cout << line << std::endl; // 输出读取到的内容}inFile.close(); // 关闭文件return 0;
}
3.读文件的方式

在C++中,读取文件的主要方式是使用<fstream>库中的ifstream类(输入文件流)。

  • 字符读取:使用get()函数逐个读取字符。

    char ch;
    while (inFile.get(ch)) {std::cout << ch;
    }
    
  • 行读取:使用getline()函数读取整行文本。

    std::string line;
    while (std::getline(inFile, line)) {std::cout << line << std::endl;
    }
    
  • 直接读入变量:使用提取运算符>>读取数据直到遇到分隔符(通常是空格或换行符)。

    int number;
    while (inFile >> number) {std::cout << number << std::endl;
    }
    
4.注意事项
  • 在处理文件操作时,始终检查文件是否成功打开,以避免未预期的行为。
  • 使用close()函数关闭文件是一个好习惯,尽管在对象销毁时(例如函数结束时)也会自动关闭,但显式关闭可以立即释放资源。
  • 对于大文件或性能敏感的应用,考虑使用缓冲区读写以提高效率。
  • 如果需要同时读写同一个文件,可以使用fstream类。

在C++中,当创建一个文件流对象(如ifstreamofstreamfstream)并直接在构造函数中指定文件名时,实际上已经隐式地调用了open函数来打开文件。这种方式的好处在于代码更加简洁易读,例如:

std::ofstream outFile("example.txt");

这条语句就完成了创建一个ofstream对象并打开名为example.txt的文件用于写入的操作。这种方式使得初始化与文件打开动作合为一体,减少了代码量,提高了代码的直观性。

然而,并不是所有情况下都会省略显式的.open调用。在以下几种场景中,你可能会选择直接使用.open方法:

  1. 动态文件名:如果文件名是在运行时确定的,你可能需要先创建流对象,然后在适当的时候调用.open

  2. 多次打开不同文件:如果你的程序需要在运行过程中打开多个不同的文件,可以复用同一个流对象,通过调用.close后再次使用.open来切换到另一个文件。

  3. 更精细的控制.open函数允许你更精确地控制文件的打开模式(如追加模式ios::app、二进制模式ios::binary等),这在构造函数中可能不易表达或需要修改时更为灵活。

  4. 错误处理:显式调用.open可以让你更直接地处理文件打开失败的情况,因为你可以立即检查.open的返回值或使用流对象的布尔转换特性来判断操作是否成功。

2.读写二进制文件

在C++中读写二进制文件,主要使用<fstream>库中的ifstream(输入流,用于读取)和ofstream(输出流,用于写入)类,并设置ios::binary模式来确保以二进制形式处理文件。下面分别介绍读取和写入二进制文件的方法。

1.写入二进制文件
#include <fstream>
#include <iostream>int main() {const char data[] = "Hello, Binary World!";std::ofstream outFile("example.bin", std::ios::binary);if (!outFile) {std::cerr << "无法打开文件进行写入!" << std::endl;return 1;}// 写入数据outFile.write(reinterpret_cast<const char*>(&data), sizeof(data));// 或者针对特定类型的数据,例如写入一个整数// int num = 12345;// outFile.write(reinterpret_cast<char*>(&num), sizeof(num));outFile.close();std::cout << "二进制数据已成功写入文件。" << std::endl;return 0;
}
2.读取二进制文件
#include <fstream>
#include <iostream>int main() {std::ifstream inFile("example.bin", std::ios::binary);if (!inFile) {std::cerr << "无法打开文件进行读取!" << std::endl;return 1;}// 确定文件大小inFile.seekg(0, inFile.end);std::streampos fileSize = inFile.tellg();inFile.seekg(0, inFile.beg);// 分配足够的内存来存储文件内容char* buffer = new char[fileSize];// 读取文件内容inFile.read(buffer, fileSize);// 使用或处理读取到的二进制数据std::cout.write(buffer, fileSize);delete[] buffer; // 清理分配的内存inFile.close();std::cout << "二进制数据已成功读取。" << std::endl;return 0;
}
3.注意事项
  • 使用std::ios::binary标志是为了确保文件以二进制形式读写,避免因文本模式下的行结束符转换等问题。
  • 在读取二进制数据时,需要预先知道文件的大小或数据结构,以便正确分配内存和解析数据。
  • 使用完分配的内存记得释放,避免内存泄漏。
  • 当处理特定类型的数据(如整数、浮点数等)时,直接读写其内存表示,需确保数据对齐和类型匹配。

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

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

相关文章

C++STL 初阶(5)vector的简易实现(上)

不同于string只实现一个最简单的版本&#xff0c;vector在此处我们要实现的是模版类&#xff0c;类模版的声明和定义分离非常不方便&#xff08;会在链接时报错&#xff09;&#xff0c;所以我们都只在一个vector.h下去实现声明和定义。后续我们提及到的库里面实现的vector也是…

Spring框架中Bean的生命周期

Bean的生命周期通常指的是从创建到初始化&#xff0c;经过一系列的流程&#xff0c;最终销毁的过程。只不过&#xff0c;在Spring框架中&#xff0c;Bean的生命周期是由Spring IOC容器来管理的。在Spring中&#xff0c;我们定义Bean时&#xff0c;也可以自己指定初始化和销毁的…

HCIP--OSPF(笔记3)

OSPF扩展配置 手工认证 【1】接口认证 -- 直连的邻居间&#xff0c;设定认证口令&#xff0c;进行身份核实&#xff0c;同时对双方交互的数据进行加密保护 [r9-GigabitEthernet0/0/1]ospf authentication-mode md5 1 cipher 123456 邻居间认证模式、编号、密码必须完全一致 【…

python实训day2

1、 from ming import * # 有点像C语言中的头文件 """在Python开发环境中&#xff0c;封装一个函数&#xff0c;功能目标为&#xff1a;通过两个整数参数一次性获取和、差、积、商四个值 """ def calc(a, b):return a b, a - b, a * b, a / b…

apollo规划架构

算法的基本架构 我们在最开始直接给出规划决策算法架构框图&#xff0c;然后一一介绍每个框图结构的细节&#xff1a; 模块的入口是 PlanningComponent&#xff0c;在 Cyber 中注册模块&#xff0c;订阅和发布消息&#xff0c;并且注册对应的 Planning 类。Planning 的过程之前…

【SQL】DATETIME 和 TIMESTAMP 的区别

在 SQL 中&#xff0c;DATETIME 和 TIMESTAMP 是用于存储日期和时间数据的两种数据类型&#xff0c;但它们在存储范围、时区处理和使用场景上有显著区别。以下是详细的解释&#xff1a; 1. DATETIME 定义: DATETIME 类型用于存储日期和时间&#xff0c;精度为秒。格式: YYYY-…

三生随记——时间的诅咒

深夜&#xff0c;月光透过薄雾洒落在小镇的古老街道上。风轻轻吹过&#xff0c;带起一阵阵阴凉的气息。小镇的居民早已沉睡&#xff0c;只有偶尔传来的狗吠声打破了夜的寂静。 在这个小镇上&#xff0c;有一个叫做李明的年轻人。他有一块非常特别的手表&#xff0c;这块手表是他…

Python协程探秘:async/await的魔法

Python协程探秘&#xff1a;async/await的魔法 在Python的并发编程世界中&#xff0c;协程&#xff08;Coroutines&#xff09;和async/await关键字正逐渐崭露头角&#xff0c;它们提供了一种高效、轻量级的并发解决方案。本文将深入解释协程的概念&#xff0c;探讨async/awai…

网络技术原理需要解决的5个问题

解决世界上任意两台设备时如何通讯的&#xff1f;&#xff1f; 第一个问题&#xff0c;pc1和pc3是怎么通讯的&#xff1f; 这俩属于同一个网段&#xff0c;那么同网段的是怎么通讯的&#xff1f; pc1和pc2属于不同的网段&#xff0c;第二个问题&#xff0c;不同网段的设备是…

敏捷开发笔记(第7章节)--什么是敏捷设计

目录 1&#xff1a;PDF上传链接 7.1: 软件出了什么错 7.2: 设计的臭味--腐化软件的气味 7.2.1: 什么激化了软件的腐化 7.2.2: 敏捷团体不允许软件腐化 7.3: “copy”程序 1: 初始设计 2: 需求在变化 3: 得寸进尺 4: 期望变化 7.3.1: “copy”程序的敏捷设计 7.3.2:…

leetcode 二分查找·系统掌握 有效的完全平方数

题目&#xff1a; 题解&#xff1a; 就是一个非常普通的二分查找&#xff0c;但是需要注意的是查找的上下界&#xff0c;因为是完全平方&#xff0c;所以可以把上界设为这个数的一半&#xff0c;但是要特殊处理num等于1的时候。 bool isPerfectSquare(int num) {if(num1)retur…

element-plus form表单组件之el-date-picker日期选择器组件

el-date-picker日期选择器组件可根据年&#xff0c;月&#xff0c;日期&#xff0c;时间范围来进行选择&#xff0c;可以自定义日期格式&#xff0c;和样式&#xff0c;还提供多种内置事件。 主要属性如下 属性名说明类型可选值默认值model-value / v-model绑定值&#xff0c…

qt开发-11_Dialog 仿苹果支付界面

QDialog 是 Qt 框架中用于创建对话框的一个基类。对话框是一种特殊类型的窗口&#xff0c;通常用于短暂的交互和信息交换&#xff0c;如接收用户输入、显示消息、询问用户决定等。QDialog 提供了一种方便的方式来实现这些功能&#xff0c;并能够控制用户与其他窗口的交互性&…

Intent、Intent Filter和BroadcastReceiver:Android中的核心通信机制

在Android开发中&#xff0c;Intent、Intent Filter和BroadcastReceiver构成了应用间通信&#xff08;IPC&#xff09;和内部通信的基石。它们不仅为开发者提供了强大的通信能力&#xff0c;还确保了应用的灵活性和扩展性。下面&#xff0c;我们将从技术难点、面试官关注点、回…

自动更新阿里云CDN SSL证书

deploy-certificate-to-aliyun 随着各大CA机构开始收割用户&#xff0c;云厂商们提供的免费SSL证书也由之前的12个月变成现在的3个月。笔者一直使用阿里云的OSS作为图床&#xff0c;说实话在如果继续在阿里云上三个月免费一换也太频繁了 笔者在这里使用github action来每隔两个…

C++ (week9):Git

文章目录 1.git介绍2.git安装3.git配置4.获取自己的SSH公钥5.新建仓库6.邀请开发者7.克隆远程仓库到本地8.在本地进行开发9.本地项目推送到远程仓库10.git的工作原理11.分支管理(1)合作开发的方式(2)分支管理(3)分支合并的原理、冲突管理 12.git 与 svn 的区别13.设置alias别名…

内容安全复习 8 - 视觉内容伪造与检测

文章目录 研究背景内容伪造方法虚假人脸生成人脸替换属性编辑表情重演跨模态人脸编辑 伪造检测方法眨眼检测交互式人脸活体检测一些了解方法挑战 研究背景 图像内容篡改造成新闻报道的偏颇易导致社会和公共秩序的不安&#xff0c;对公共安全产生不良影响。 造成的影响&#x…

达梦8 通过日志解释数据守护系统的关闭顺序

关闭守护系统时&#xff0c;必须按照一定的顺序来关闭守护进程和数据库实例。特别是自动切换 模式&#xff0c;如果退出守护进程或主备库的顺序不正确&#xff0c;可能会引起主备切换&#xff0c;甚至造成守护进程 DM 数据守护与读写分离集群组分裂。 官方推荐通过在监视器执行…

如何在Java中使用注解:自定义注解的实现

如何在Java中使用注解&#xff1a;自定义注解的实现 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; Java中的注解&#xff08;Annotation&#xff09;是一种代…

macbook配置adb环境和用adb操作安卓手机

&#xff08;参考&#xff1a;ADB工具包的安装与使用_adb工具箱-CSDN博客&#xff09; 第一步&#xff1a;从Android开发者网站下载Android SDK&#xff08;软件开发工具包&#xff09;。下载地址为&#xff1a; 第二步&#xff1a;解压下载的SDK压缩文件到某个目录中。 进入解…