c++文件操作 (1) -- 读写文件
目录
为什么使用文件操作
文件输入流和输出流 -- 相对于内存而言
文件操作
1. 文件操作常用类以及头文件
2. 文件输入流(写文件操作)
1. 写文本文件
1)文件操作是使用对象来实现的
2)文件输出
3)打开文件
open函数 :
2. 读文本文件
3. 写二进制文件
4. 读二进制文件
为什么使用文件操作
我们平常在程序中经常需要用户输入相应的数据,但是这些数据在用户输入之后, 是在内存中存储,当程序结束之后,这些数据就会消失。当下次执行程序的时候,用户还需要再次输入信息。
但是,大多数时候,我们希望在用户输入信息时就将用户输入的数据进行存储,当程序再次执行的时候使用之前输入的数据。 虽然我们输入数据之后,数据会存储在内存当中,但是内存是无法长久存储数据的。 内存只有程序执行的时候会存放数据,在程序执行结束之后,就不会在保存数据了。 所以,我们想要存储数据就得需要其它的东西。
此处,我们使用的是文件--可以永久的存储数据,其实在我们使用电脑的过程中,就已经在使用文件了,这些文件是存储在硬盘中的,特点就是,可以永久的存储数据,但是存取的速度会很慢。
我们所说的文件操作,就是将数据中输入和产生的信息存储到文件当中,实现永久保存数据。
我们在执行程序的时候需要将程序需要的数据从文件中导入到内存,然后供程序在正常执行。
文件输入流和输出流 -- 相对于内存而言
我们要将程序中产生的数据存储到文件中,并且还需要在程序执行的时候将文件中的数据读入到程序(内存)。 这就涉及到了读文件和写文件的操作。
其实很好理解,我们可以将读文件理解为: 程序和文件之间建立一个通道,将文件中的数据顺着通道流到程序(内存)中,这就是文件输入流。
那么相反,写文件就是将数程序中的数据由通道流到文件中,这就是文件输出流。
文件输入流和文件输出流,可以从内存的角度,从内存流出 -- 输出流, 流入内存 -- 输入流。
文件操作
1. 文件操作常用类以及头文件
c++文件操作首先需要导入头文件 <fstream> 。
文件的输入输出属于c++IO流的一部分,c++将输入输出的信息封装在类中,根据需求进行了相应的封装。主要使用的有,istream(inputstream): 输入流, ostream(outputstream): 输出流,iostream(输入流和输出流结合,多继承上面两个类)。
而对于文件,主要有ifstream(f表示file): 文件输入流, ofstream : 文件输出流, fstream: 文件输入输出流。
输出流包含文件流(上面文件流都是对应IO流的子类),为了方便使用,继承出对文件操作的类。
2. 文件输入流(写文件操作)
1. 写文本文件
#include <iostream>
#include <stdlib.h>
#include <fstream>using namespace std;int main(void) {/*实现写文本文件*/ofstream io;io.open("data.txt");// 文件没有打开成功,则结束程序if (!io.is_open()) return 1; io << "好好学习" << endl;io.close();system("pause");return 0;
}
上面代码中对文本文件data.txt写入了"好好学习"。
1)文件操作是使用对象来实现的
我们使用文件流的类对象对文件进行操作: ofstream io; // 定义了ofstream类对象,用来操作文件输出。
2)文件输出
ofstream和fstream都可以用来实现输出到文件的操作,如果会是输出的话,建议使用专门用来输出的ofsream
3)打开文件
对文件操作,必须得打开文件,使用定义的对象io,调用打开文件的接口open,来打开文件。
open函数 :
1. 一般使用前两个参数,第一个参数指定打开的文件,第二个参数指定打开的方式
2. 文件打开方式:
ios::in | 读方式打开文件 |
ios::out | 写方式打开文件 |
ios::trunc | 如果文件存在,将文件的长度截取为0(就是将原来内容都删除掉) |
ios::app | 尾部追加方式(从文件的尾部写入) |
ios::ate | 文件打开后定位到文件尾部 |
ios::binary | 以二进制方式打开文件(不指定,以文本方式打开文件) |
以上的所有打开方式,可以使用 | 位运算符组合起来使用。
3. open的第二个参数可以自己指定,也可以不指定,直接使用默认值。
1) ifstream是读文件的类,所以其对象调用open,第二个参数默认为ios::in
2) ofstream是写文件的类,所以其对象调用open,第二个参数默认为ios::out
3) fstream既可以读文件,也可以写文件,所以其对象调用open,第二个参数默认为,ios::in | ios::out。
4. 打开文件之后,我们就可以使用输入输出操作给文本文件中写入数据了。 io << "好好学习"; 可以将io看成此时打开的文件,将"好好学习" 流入到io中。 <<
5. 健壮性检测--文件是否打开成功(is_open())
在写代码的时候,我们应该考虑到代码的健壮性,在做一些操作的时候,应该去判断是否可以操作成功。然后再去执行相应的操作。
对于是否打开成功, 我们可以调用is_open()函数来判断,如果打开成功,返回true,反之,返回false。
if(!io.is_open()){...}; 表示文件打开失败后进行的操作。
6. 关闭文件,文件也是一种资源,当我们使用结束之后一定要将文件关闭(调用close函数) 。
2. 读文本文件
int main(void) {ifstream io;string data; // 存放从文件中读取的数据io.open("data.txt");if (!io.is_open()) return 0;io >> data;cout << data << endl;io.close();system("pause");return 0;
}
读文件和写文件很类似,只是使用输出流的类对象。 将io对应文件的数据流到(>>)data变量中(内存中)。
3. 写二进制文件
写(读)二进制文件,需以二进制形式打开文件,但是我们open默认以文本文件打开,所以需要指定打开方式。
int main(void) {ofstream io;int nub = 20;io.open("data.dat",ios::out | ios::binary);if (!io.is_open()) return 0;// 给二进制文件中写数字io.write((char*)&nub,sizeof(nub));io << "好好学习"; //给二进制文件中写字符串/字符io.close();system("pause");return 0;
}
1. 由于open默认是以文本模式打开的,我们要使用二进制模式打开文件,就需要指定后面的打开方式。ios::out | ios::binary 表示以二进制形式打开文件,并且进行写文件的操作。
2. 给二进制文件中写字符或者字符串的时候,可以和文本文件的输入输出一样,直接使用io << "字符串",给文件中写入数据。
但是,给二进制文件中写数字的时候,需要使用write函数来写。
write()函数有两个参数,第一个参数是要写入数据的地址(并且是char*的地址,所以需要进行类型转换),第二个参数是写入数据占用的字节数
为什么给二进制文件写字符串/字符和写数字不同,请看 文本文件和二进制文件的区别
4. 读二进制文件
int main(void) {ifstream io;int nub;string data;io.open("data.dat", ios::in | ios::binary);if (!io.is_open()) return 0;io.read((char*)&nub, sizeof(nub));io >> data;cout << nub << " " << data;io.close();system("pause");return 0;
}
读文本文件和写文本文件类似,只是我们读文本文件中的数字的时候需要使用函数read(),其参数和write()是一样的。 读文本文件的字符串直接使用 io >> data 读取即可。
具体区别看文本文件和二进制文件的区别
相关文章:
c++文件操作 (1) -- 读写文件
目录 为什么使用文件操作 文件输入流和输出流 -- 相对于内存而言 文件操作 1. 文件操作常用类以及头文件 2. 文件输入流(写文件操作) 1. 写文本文件 1)文件操作是使用对象来实现的 2)文件输出 3)打开文件 open函数 ÿ…...
PHP操作Mysql记录数多引发的空白错误
1 错误由来 php操作三张表,一张表有近四十万条记录,另外两张表记录数在三万左右,三张表又关联。应用左连接left join。 $qLStr "select pu.pd_no, pu.common_name, pu.purchase_cost, pu.medication_area, pu.total_dosage, pu.contro…...

transformer和vit学习笔记
以下记录自己对transformer的学习笔记,可能自己看得懂【久了自己也忘了看不懂】,别人看起来有点乱。以后再优化文档~ 小伙伴请直接去看学习资源: Transformer的理解T-1_哔哩哔哩_bilibili 首先,时序处理:一些模型的出…...

人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示)
人脸识别 FaceNet人脸识别(一种人脸识别与聚类的统一嵌入表示) FaceNet的简介Facenet的实现思路训练部分 FaceNet的简介 Facenet的实现思路 import torch.nn as nndef conv_bn(inp, oup, stride 1):return nn.Sequential(nn.Conv2d(inp, oup, 3, stride…...

Python tkinter (6) Listbox
Python的标准Tk GUI工具包的接口 tkinter系列文章 python tkinter窗口简单实现 Python tkinter (1) —— Label标签 Python tkinter (2) —— Button标签 Python tkinter (3) —— Entry标签 Python tkinter (4) —— Text控件 GUI 目录 Listbox 创建listbox 添加元素…...

优雅的python(二)
🌈个人主页:小田爱学编程 🔥 系列专栏:c语言从基础到进阶 🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆 😀欢迎来到小田代码世界~ &#x…...

Git安装详细步骤
目录 1、双击安装包,点击NEXT编辑 2、更改安装路径,点击NEXT 3、选择安装组件 4、选择开始菜单页 5、选择Git文件默认的编辑器 6、调整PATH环境 7、选择HTTPS后端传输 8、配置行尾符号转换 9、配置终端模拟器与Git Bash一起使用 10、配置额外…...

首发:2024全球DAO组织发展研究
作者,张群(专注DAO及区块链应用研究,赛联区块链教育首席讲师,工信部赛迪特邀资深专家,CSDN认证业界专家,微软认证专家,多家企业区块链产品顾问) DAO(去中心化自治组织&am…...

【大数据】详解 Flink 中的 WaterMark
详解 Flink 中的 WaterMark 1.基础概念1.1 流处理1.2 乱序1.3 窗口及其生命周期1.4 Keyed vs Non-Keyed1.5 Flink 中的时间 2.Watermark2.1 案例一2.2 案例二2.3 如何设置最大乱序时间2.4 延迟数据重定向 3.在 DDL 中的定义3.1 事件时间3.2 处理时间 1.基础概念 1.1 流处理 流…...
【数据结构1-2】二叉树
树形结构不仅能表示数据间的指向关系,还能表示出数据的层次关系,而有很明显的递归性质。因此,我们可以利用树的性质解决更多种类的问题。 但是在平常的使用中,我们并不需要使用这么复杂的结构,只需要建立一个包含int r…...

ajax点击搜索返回所需数据
html 中body设置(css设置跟进自身需求) <p idsearch_head>学生信息查询表</p> <div id"div_1"> <div class"search_div"> <div class"search_div_item"> …...

Redis6基础知识梳理~
初识NOSQL: NOSQL是为了解决性能问题而产生的技术,在最初,我们都是使用单体服务器架构,如下所示: 随着用户访问量大幅度提升,同时产生了大量的用户数据,单体服务器架构面对着巨大的压力 NOSQL解…...
在Python中如何使用集合进行元素操作
目录 1. 创建集合 2. 添加或删除元素 3. 集合运算 4. 其他集合操作 总结 在Python中,集合(set)是一种基本的数据结构,用于存储无序且唯一的元素。这意味着集合中的每个元素都是独一无二的,且集合不保持任何元素的…...

2024年阿里云幻兽帕鲁Palworld游戏服务器优惠价格表
自建幻兽帕鲁服务器租用价格表,2024阿里云推出专属幻兽帕鲁Palworld游戏优惠服务器,配置分为4核16G和4核32G服务器,4核16G配置32.25元/1个月、10M带宽66.30元/1个月、4核32G配置113.24元/1个月,4核32G配置3个月339.72元。ECS云服务…...
Atlassian Confluence Data Center and Server 权限提升漏洞复现(CVE-2023-22515)
0x01 产品简介 Atlassian Confluence是一款由Atlassian开发的企业团队协作和知识管理软件,提供了一个集中化的平台,用于创建、组织和共享团队的文档、知识库、项目计划和协作内容。是面向大型企业和组织的高可用性、可扩展性和高性能版本。 0x02 漏洞概述 Atlassian Confl…...

打开 IOS开发者模式
前言 需要 1、辅助设备:苹果电脑; 2、辅助应用:Xcode; 3、准备工作:苹果手机 使用数据线连接 苹果电脑; 当前系统版本 IOS 17.3 通过Xcode激活 两指同时点击 Xcode 显示选择,Open Develop…...

【C语言刷题系列】交换两个变量的三种方式
文章目录 1.使用临时变量(推荐) 2.相加和相减的方式(值较大时可能丢失数据) 3.按位异或运算 本文所属专栏C语言刷题_倔强的石头106的博客-CSDN博客 两个变量值的交换是编程中最常见的问题之一,以下将介绍三种变量的…...

架构师之路(十五)计算机网络(网络层协议)
前置知识(了解):计算机基础。 作为架构师,我们所设计的系统很少为单机系统,因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 ARP协议 地址解…...

【JSON2WEB】03 go的模板包html/template的使用
Go text/template 是 Go 语言标准库中的一个模板引擎,用于生成文本输出。它使用类似于 HTML 的模板语言,可以将数据和模板结合起来,生成最终的文本输出。 Go html/template包实现了数据驱动的模板,用于生成可防止代码注入的安全的…...

3 JS类型 值和变量
计算机对value进行操作。 value有不同的类型。每种语言都有其自身的类型集合。编程语言的类型集是该编程语言的基本特性。 value需要保存一个变量中。 变量的工作机制是变成语言的另一个基本特性。 3.1概述和定义 JS类型分为: 原始类型和对象类型。 原始类型&am…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...

GraphRAG优化新思路-开源的ROGRAG框架
目前的如微软开源的GraphRAG的工作流程都较为复杂,难以孤立地评估各个组件的贡献,传统的检索方法在处理复杂推理任务时可能不够有效,特别是在需要理解实体间关系或多跳知识的情况下。先说结论,看完后感觉这个框架性能上不会比Grap…...
shell脚本质数判断
shell脚本质数判断 shell输入一个正整数,判断是否为质数(素数)shell求1-100内的质数shell求给定数组输出其中的质数 shell输入一个正整数,判断是否为质数(素数) 思路: 1:1 2:1 2 3:1 2 3 4:1 2 3 4 5:1 2 3 4 5-------> 3:2 4:2 3 5:2 3…...