C++之文件操作

1.C++文件操作

  C++中文件操作头文件:fstream。
  文件类型:文件文件和二进制文件。

  • 文件操作三大类:
        ofstream 写操作
        ifstream 读操作
        fstream:读写操作
  • 文件打开方式:
标志说明
ios::in只读
ios::out只写,文件不存在则创建,存在则打开并截断原内容
ios::ate打开一个已有的文件,并指向文件读指针指向文件尾,若文件不存在,则打开出错
ios::app打开文件,从文件尾添加内容,若文件不存在则创建
ios::trunc打开文件同时会截断原内容,单独使用时与ios::out相同
ios::binary以二进制方式打开
ios::in|ios::out打开文件,可读也可写,文件打开时原内容保持不变,若不存在则打开出错
ios::in|ios::out|ios::trunc打开文件,可读写,会截断原内容,文件不存在则创建

2.文本方式写入示例

#include < iostream >
#include < fstream >
using namespace std;
int main()
{
	/*1.创建文件*/
	ofstream fp;
	fp.open("test.txt",ios::out);//创建文件,会截断原内容
	if (!fp.is_open())//文件打开失败返回false
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	fp << "C++文件操作示例!" << endl;
	fp << "写入数据测试" << endl;
	fp << "姓名:IT_阿水" << "t工作方向:" << "嵌入式开发" << "t工作时间:" << "6年" << endl;
	fp.close();//关闭文件
	system("pause");
}

3.文本方式读取示例

  C++中读取数据有多种方式实现。

2.1 示例1:重载>>读取

#include < iostream >
#include < fstream >
using namespace std;
int main()
{
	ifstream ifs;
	ifs.open("test.txt",ios::in);//只读方式打开
	if (!ifs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	string str;
	while (ifs >> str)//以字符串方式读取
	{
		cout << "str=" << str << endl;;
	}
	//关闭文件
	ifs.close();
	system("pause");
}

2.2 利用成员函数getline读取

#include < iostream >
#include < fstream >
using namespace std;
int main()
{
	ifstream ifs;
	ifs.open("test.txt",ios::in);//只读方式打开
	if (!ifs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	//第二种:getline()
	char buff[1024];
	while (ifs.getline(buff, sizeof(buff)))
	{
		cout << "buff=" << buff << endl;
	}
	//关闭文件
	ifs.close();
	system("pause");
}

2.3 单个字符方式读取get()

#include < iostream >
#include < fstream >
using namespace std;
int main()
{
	ifstream ifs;
	ifs.open("test.txt",ios::in);//只读方式打开
	if (!ifs.is_open())
	{
		cout << "文件打开失败!" << endl;
		return 0;
	}
	//第三种:单个字符方式读取
	char c;
	while ((c = ifs.get()) != EOF)
	{
		cout << c;
	}
	//关闭文件
	ifs.close();
	system("pause");
}

4.二进制方式读写示例

  • 二进制数据写入文件
函数:write(const _Elem* _Str, streamsize _Count)
 形参:_Str --写入的内容的起始地址
       _Count  --写入的字节数
  • 二进制数据读取文件
read(_Elem* _Str, streamsize _Count) ;
 形参:_Str --读取内容存放缓冲区
       _Count --要读取的字节数
#include < iostream >
#include < fstream >
#include < cstring >
using namespace std;
class Person
{
public:
	Person() {}
	Person(const char* name, int age)
	{
		strcpy_s(this->name, name);
		this->age = age;
	}
	char name[20];//姓名
	int age;//年龄
};
int main()
{
	/*二进制写入数据示例*/
	fstream fs("test.doc", ios::out | ios::binary);
	if (!fs.is_open())
	{
		cout << "文件创建失败" << endl;
		return 0;
	}
	Person p("小王", 18);
	fs.write((const char *) & p, sizeof(p));//写入内容
	fs.close();//关闭文件
	/*二进制读取数据示例*/
	fs.open("test.doc", ios::in | ios::binary);
	if (!fs.is_open())
	{
		cout << "文件打开失败" << endl;
		return 0;
	}
	Person p2;
	fs.read((char *) & p2, sizeof(p2));
	cout << "读取的内容:" << endl;
	cout << "姓名:" << p2.name < < "t年龄:" << p2.age << endl;
	fs.close();
	system("pause");

}

5.C++文件指针偏移

//C++文件指针偏移
  seekg(pos_type _Pos,ios_base::seekdir _Way)  --用于输入流,偏移位置指针到指定位置
  seekp(pos_type _Pos,ios_base::seekdir _Way)  --用于输出流,偏移位置指针到指定位置
	第一个参数:偏移量
	第二个参数:基于哪个位置
				ios::beg  --文件头
				ios::end  --文件尾
				ios::cur  --当前位置
  streamoff tellg()  --用于输入流,返回当前指针位置,streamoff 是一个long long类型
  streamoff tellp()  --用于输出流,返回当前指针位置
  返回值返回基于文件头的偏移量,字节为单位。失败则返回-1
  • 示例:
#include < iostream >
#include < fstream >
using namespace std;
int main()
{
	ifstream fs;
	fs.open("test.txt", ios::in );//打开文件,不存在则打开失败,不会截断原内容
	if (!fs.is_open())
	{
		cout << "文件打开失败" << endl;
		return 0;
	}
	fs.seekg(0,ios::end);//将文件指针偏移到文件末尾
	char buff[1024];
	streamoff  size = fs.tellg();//获取文件大小
	cout << "文件大小:" << size << "字节" << endl;
	fs.seekg(0, ios::beg);//将输入流偏移到文件头
	while (fs >> buff)
	{
		cout << buff << endl;
	}
	fs.close();
	system("pause");
	return 0;
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JVM详解(超详细)

目录 JVM 的简介 JVM 执行流程 JVM 运行时数据区 由五部分组成 JVM 的类加载机制 类加载的过程(五个) 双亲委派模型 类加载器 双亲委派模型的优点 JVM 中的垃圾回收策略 GC GC 中主要分成两个阶段 死亡对象的判断算法 引用计数算法 可达性分析算法 垃圾回收算…

【设计模式——学习笔记】23种设计模式——组合模式Composite(原理讲解+应用场景介绍+案例介绍+Java代码实现)

文章目录 案例引入学校院系展示 介绍基本介绍使用场景登场角色 案例实现案例1类图代码实现 案例2类图代码实现拓展 组合模式在JDK的HashMap源码中的应用组合模式总结文章说明 案例引入 学校院系展示 编写程序展示一个学校院系结构: 需求是这样&#xff0c;要在一个页面中展示…

EXCEL,如何比较2个表里的数据差异(使用数据透视表)

目录 1 问题: 需要比较如下2个表的内容差异 1.1 原始数据喝问题 1.2 提前总结 2 使用EXCEL公式方法 2.1 新增辅助列&#xff1a; 辅助index 2.2 具体公式 配合条件格式 使用 3 数据透视表方法 3.1 新增辅助列&#xff1a; 辅助index 3.2 需要先打开 数据透视表向导 …

CMU 15-445 -- Multi-Version Concurrency Control - 16

CMU 15-445 -- Multi-Version Concurrency Control - 16 引言MVCCExample #1Example #2小结 Design DecisionsConcurrency Control ProtocolVersion StorageAppend-Only StorageTime-Travel StorageDelta Storage Garbage CollectionTuple-Level GCTransaction-Level GC Index …

linux系统安装mysql

背景 之前用docker安装mysql&#xff0c;受限太多&#xff0c;这次不用docker直接安装。 参考文章 linux系统安装mysql 文章写的很细&#xff0c;亲测有效。 问题记录 不过存在一个小问题&#xff0c;这里记录一下自己的解决方法 问题&#xff1a;安装完mysql&#xff0c;启…

MD-MTSP:成长优化算法GO求解多仓库多旅行商问题MATLAB(可更改数据集,旅行商的数量和起点)

一、成长优化算法GO 成长优化算法&#xff08;Growth Optimizer&#xff0c;GO&#xff09;由Qingke Zhang等人于2023年提出&#xff0c;该算法的设计灵感来源于个人在成长过程中的学习和反思机制。学习是个人通过从外部世界获取知识而成长的过程&#xff0c;反思是检查个体自…

【物联网无线通信技术】UWB定位从理论到实现(DW1000)

超宽带&#xff08;UWB&#xff09;是一种基于IEEE 802.15.4a和802.15.4z标准的无线电技术&#xff0c;可以非常精确地测量无线电信号的飞行时间&#xff0c;从而实现厘米级精度的距离/位置测量。UWB技术除了提供定位功能外&#xff0c;它本身是一种通信技术&#xff0c;其提供…

Labelme制作COCO格式的图像语义分割数据集

1.按照labelme工具地址先配置安装labelme&#xff1a;GitHub - wkentaro/labelme: Image Polygonal Annotation with Python (polygon, rectangle, circle, line, point and image-level flag annotation). 2.给自己的数据集画多边形框-Create Polygons 每张图像画完框后&#…

[个人笔记] vCenter设置时区和NTP同步

VMware虚拟化 - 运维篇 第三章 vCenter设置时区和NTP同步 VMware虚拟化 - 运维篇系列文章回顾vCenter设置时区和NTP同步&#xff08;附加&#xff09;ESXi设置alias参考链接 系列文章回顾 第一章 vCenter给虚机添加RDM磁盘 第二章 vCenter回收活跃虚拟机的剩余可用空间 vCente…

linux+Jenkins+飞书机器人发送通知(带签名)

文章目录 &#x1f31e;如何使用&#x1f33b;在linux 上安装python 环境&#x1f33b;发送消息python脚本&#x1f98b;把脚本上传倒linux上&#x1f98b;jenkins 上执行脚本 &#x1f31e;如何使用 自定义机器人使用指南飞书官网https://open.feishu.cn/document/client-doc…

ChatGPT炒股:爬取股票官方微信公众号的新闻资讯

上市公司的微信公众号&#xff0c;现在已经成为官网之外最重要的官方信息发布渠道。有些不会在股票公告中发布的消息&#xff0c;也会在微信公众号进行发布。所以&#xff0c;跟踪持仓股票的公众号信息&#xff0c;非常重要。 下面&#xff0c;以贝特瑞的官方公众号“贝特瑞新…

beego验证码(配置到redis存储)

我们定义一个全局变量用于存储redis连接 RedisDb *redis.Client 然后连接 redis 这一块我们将redis信息写到app.conf文件里了&#xff1a; redisDb 1 redisAddr "127.0.0.1:6379" redisPwd "" package initializeimport ("beego_learning/global&q…

经典的数组和指针结合的OJ题

一、合并两个有序数组 leetcode链接 题目描述&#xff1a; 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#xff0c;使合并后的数组同样按 非递…

[Linux]进程控制详解!!(创建、终止、等待、替换)

hello&#xff0c;大家好&#xff0c;这里是bang___bang_&#xff0c;在上两篇中我们讲解了进程的概念、状态和进程地址空间&#xff0c;本篇讲解进程的控制&#xff01;&#xff01;包含内容有进程创建、进程等待、进程替换、进程终止&#xff01;&#xff01; 附上前2篇文章…

七大经典比较排序算法

1. 插入排序 (⭐️⭐️) &#x1f31f; 思想&#xff1a; 直接插入排序是一种简单的插入排序法&#xff0c;思想是是把待排序的数据按照下标从小到大&#xff0c;依次插入到一个已经排好的序列中&#xff0c;直至全部插入&#xff0c;得到一个新的有序序列。例如&#xff1a;…

Vue3搭建启动

Vue3搭建&启动 一、创建项目二、启动项目三、配置项目1、添加编辑器配置文件2、配置别名3、处理sass/scss4、处理tsx(不用的话可以不处理) 四、添加Eslint 一、创建项目 npm create vite 1.project-name 输入项目名vue3-vite 2.select a framework 选择框架 3.select a var…

【Spring】聊聊Spring如何解决的循环依赖以及三级缓存

循环依赖是什么 在平时的面试中&#xff0c;只要问到Spring&#xff0c;那么大概率肯定会问什么是循环依赖&#xff0c;Sping是如何解决循环依赖的。以及三级缓存机制是什么。所以为了从根本上解决这个问题&#xff0c;本篇主要详细介绍一下循环依赖的问题。 Spring Bean初始…

谷粒商城第七天-商品服务之分类管理下的分类的拖拽功能的实现

目录 一、总述 1.1 前端思路 1.2 后端思路 二、前端实现 2.1 判断是否能进行拖拽 2.2 收集受影响的节点&#xff0c;提交给服务器 三、后端实现 四、总结 一、总述 这个拖拽功能对于这种树形的列表&#xff0c;整体的搬迁是很方便的。但是其实现却并不是那么的简单。 …

Android SDK 上手指南||第一章 环境需求||第二章 IDE:Eclipse速览

第一章 环境需求 这是我们系列教程的第一篇&#xff0c;让我们来安装Android的开发环境并且把Android SDK运行起来&#xff01; 介绍 欢迎来到Android SDK入门指南系列文章&#xff0c;如果你想开始开发Android App&#xff0c;这个系列将从头开始教你所须的技能。我们假定你…

Vue2封装自定义全局Loading组件

前言 在开发的过程中&#xff0c;点击提交按钮&#xff0c;或者是一些其它场景总会遇到Loading加载框&#xff0c;PC的一些UI库也没有这样的加载框&#xff0c;无法满足业务需求&#xff0c;因此可以自己自定义一个&#xff0c;实现过程如下。 效果图 如何封装&#xff1f; 第…