C++ 初阶 文件操作和io流

news2024/11/25 20:54:01

作者:@小萌新
专栏:@C++初阶
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:简单介绍C++中的文件操作和io流

文件操作和io流

  • C语言中的输入和输出
  • 流是什么?
  • C++io流
    • C++标准io流
    • C++中流的特性
    • C++文件io流
    • 以二进制形式操作文件
    • 以文本形式操作文件
    • 以流形式操作文件
  • stringstream的介绍
  • 总结

C语言中的输入和输出

首先我们先回顾下在C语言中我们是怎么样输入和输出的

经常使用的两个函数是不是printf还有scanf

关于printf的具体介绍和用法可以参考我的这篇博客

Printf的使用

我们使用printf输出 使用sacnf输入来完成C语言中的各种io操作

流是什么?

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且有方向性的数据的抽象描述。

所以从这段文字中我们就能推断出流的特性

它具有有序性 连续性 方向性

比如说我们的cout 就叫做流插入操作符 它用来输出数据

它可以连续的输出数据 它输出数据是有序的 全部符合流的性质

cin 流提取操作符同理

为了实现这种流动 C++定义了I/O标准类库 当中的每个类都称为流/流类 用以完成某方面的功能

C++io流

如下图
在这里插入图片描述

C++标准io流

C++标准库提供了4个全局流对象(cin、cout、cerr、clog):

  1. 使用cout进行标准输出,即数据从内存流向控制台(显示器)。
  2. 使用cin进行标准输入,即数据通过键盘输入到程序中。
  3. 使用cerr进行标准错误的输出。
  4. 使用clog进行日志的输出。

我们很明显可以发现 1 3 4全部是输出流 而2是输入流

C++中流的特性

流从缓冲区中读取数据 缓冲区数据读取完毕之后才会要求输入新的数据

以下面的代码为例

这里我们可以发现 其实我们只输入了一行的数据 就覆盖了 a b
在这里插入图片描述

输入的数据必须要类型正确

在这里插入图片描述
我们可以发现 输入了两个错误格式的数据 b并没有被赋值

如果要读取一整行的数据 我们只能用getline

假设我们要输入一个字符串 hello world

由于cin读取到空格便会结束 所以说我们没办法完整的输入之

这个时候就要用到我们的getline函数了

在这里插入图片描述

cout 和 cin 之所以能够识别不同类型的数据 是因为 它们进行了运算符重载

在这里插入图片描述
在这里插入图片描述

自定义类型的输入和输出 一般要我们来自己来重载

比如说下面的日期类

class Date
{
public:
	friend ostream& operator << (ostream& out, Date& d);
	Date()
		:_year(2022),
		_month(12),
		_day(18)
	{
		;
	}

private:
	int _year;
	int _month;
	int _day;
};

ostream& operator<<(ostream& out, Date& d)
{
	out << d._year << " " << d._month << " " << d._day;
	return out;
}

在这里插入图片描述

在线oj题中的输出

我们使用如下格式的代码 来重复输入 输出

在这里插入图片描述
值得一提的是 我们可以使用ctrl + z来模拟文件结束的标志

C++文件io流

C++中操作一个文件流对象有下面几步

  1. 定义一个文件流对象
    在这里插入图片描述

  2. 使用文件流对象以一种方式打开一个磁盘文件

在这里插入图片描述
3. 使用流插入和流提取运算符对文件进行操作

在这里插入图片描述
4. 关闭文件

以二进制形式操作文件

我们直接来看代码

void test1()
{
	fstream ofile; // 定义一个文件流对象
	ofile.open("test.bin", ostream::out | ostream::binary); //我们这里使用或来表示同时进行的意思
	char arr[] = "hello world";
	ofile.write(arr, strlen(arr));
	ofile.put('!');
	ofile.close();
}

当我们写完这个程序的时候就已经在我们的磁盘中写好了 hello world!的二进制文件

接下来我们试试看读取文件

void test2()
{
	ifstream ifile;
	ifile.open("test.bin", ofstream::in | ofstream::binary);
	ifile.seekg(0, ifile.end); //跳转到文件末尾
	int length = ifile.tellg(); //获取当前字符在文件当中的位置,即文件的字符总数
	ifile.seekg(0, ifile.beg); //重新回到文件开头
	char arr[100] = "";
	ifile.read(arr, length);
	cout << arr << endl;
	ifile.close();
}

最后我们看看效果

在这里插入图片描述

以文本形式操作文件

文本形式相对于二进制形式操作 实际上就少了一个声明二进制的读写方式

void test3()
{
	fstream ofile; // 定义一个文件流对象
	ofile.open("test1.txt",ofstream::out); 
	char arr[] = "hello world";
	ofile.write(arr, strlen(arr));
	ofile.put('!');
	ofile.close();
}
void test4()
{
	ifstream ifile;
	ifile.open("test1.txt");
	ifile.seekg(0, ifile.end); //跳转到文件末尾
	int length = ifile.tellg(); //获取当前字符在文件当中的位置,即文件的字符总数
	ifile.seekg(0, ifile.beg); //重新回到文件开头
	char arr[100] = "";
	ifile.read(arr, length);
	cout << arr << endl;
	ifile.close();
}

在这里插入图片描述
注意: 使用ofstream类对象的open函数时,若不指定打开方式,则默认以写的方式打开文件;使用ifstream类对象的open函数时,若不指定打开方式,则默认以读的方式打开文件;使用fstream类对象的open函数时,若不指定打开方式,则默认以写+读的方式打开文件

以流形式操作文件

插入

void test5()
{
	ofstream ofs("mh.txt");
	ofs << "helloworld";
	ofs.close();
}

提取

void test6()
{
	ifstream ifs("mh.txt");
	char arr[100] = "";
	ifs >> arr;
	ifs.close();
	cout << arr << endl;
}

在这里插入图片描述

stringstream的介绍

如果我们要想将一个整型数据转化为字符串格式 有下面的两种方式

1、使用itoa函数进行转化。

int a = 10;
char arr[10];
itoa(a, arr, 10); //将整型的a转化为十进制字符数字存储在字符串arr当中

2、使用sprintf函数进行转化。

int a = 10;
char arr[10];
sprintf(arr, "%d", a); //将整型的a转化为字符串格式存储在字符串arr当中

而在C++中我们则有一种新的方式

stringstream

在这里插入图片描述

它的两种用法分别是

1 将数值类型的数据转化为字符串类型

void test7()
{
	string s1;
	stringstream s;
	int a = 10;
	s << a;
	s >> s1;
	cout << s1;
}

在这里插入图片描述
2. 拼接字符串 例如

void test8()
{
	string s1;
	stringstream s;
	s << "hello " << "world!";
	s1 = s.str();
	cout << s1;
}

在这里插入图片描述

总结

在这里插入图片描述
本篇博主主要介绍了C++中的文件操作和io流 还有一个简单的stringstream类

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

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

相关文章

Jenkins全局安全配置

文章目录一、进入全局安全设置页面二、各选项功能Disable remember me&#xff08;禁用记住我&#xff09;Security Realm(安全域)Delegate to servlet container&#xff08;servlet 容器代理&#xff09;Jenkins’ own user database&#xff08;Jenkins 专有用户数据库&…

Pr:导出页面之预览与摘要窗口

使用“预览”窗口&#xff0c;可在导出前预览媒体&#xff0c;设置自定义的持续时间&#xff0c;如果导出为不同的帧大小&#xff0c;还可以控制源视频适应输出帧的方式。使用“摘要”窗口&#xff0c;可以快速查看源及输出的音视频信息。◆ ◆ ◆预览窗口范围Range可自定义导…

居家办公如何避免数据泄露?

随着疫情管控政策的调整&#xff0c;越来越多的“小阳人”出现&#xff0c;企业不得不面对员工在家远程办公。 面对突如其来的远程办公&#xff0c;很多企业都没有做好准备&#xff0c;甚至采取微信、QQ、互联网邮箱、远程会议等方式传递秘密信息。但是&#xff0c;这样的居家…

ChatGpt详细注册流程

ChatGpt详细注册流程ChatGpt的网址&#xff1a;直接点击我 点击链接后向下滑动看到TRY CHATGPT如下图所示&#xff1a; 点击TRY CHATGPT后会跳转如下图界面&#xff1a; 点击Log in(登录)如下图&#xff1a; 因为首次登录你肯定是没有账号的所以需要先点击红框框出的Sign up…

QQ注册界面仿写(HTML+CSS+JS)

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;前端案例分…

整合当地商圈资源,异业联盟打出促消费花式组合拳

如今的市场竞争白热化&#xff0c;大商家逐渐形成垄断的格局。许多行业的第一品牌跟第二品牌主宰着市场&#xff0c;为了打破这种局面&#xff0c;小商家联合起来对抗大商家&#xff0c;所以异业联盟因此诞生。那么建立异业联盟对大家有什么好处呢&#xff1f; 异业联盟针对于商…

RK3568平台开发系列讲解(工具命令篇)Android Debug Bridge常用命令

🚀返回专栏总目录 文章目录 一、工作常用的adb命令二、ADB的原理沉淀、分享、成长,让自己和他人都能有所收获!😄 📢ADB-Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。安卓调试桥 (Android Debug Bridge, adb)…

uniapp 之 扫普通二维码进入小程序

前言 因项目的需求&#xff0c;需要我完成 在微信的扫一扫中&#xff0c;扫后端定义的二维码进入小程序中 这个需求说简单也很简单&#xff0c;说难也不难&#xff0c;就是花费了我几天的时间 需要在 开发 ---> 开发管理 下的开发设置 中的 一直往下滑 直到出现 扫普通…

11、Redis_事务_秒杀案例

文章目录11、Redis_事务_秒杀案例11.1 解决计数器和人员记录的事务操作11.2 Redis事务--秒杀并发模拟11.2.1 联网11.2.2 无网络11.2.3 测试及结果11.2.3.1 通过ab测试11.2.3.2 超卖11.3 超卖问题11.4 利用乐观锁淘汰用户&#xff0c;解决超卖问题。11.5 继续增加并发测试11.5.1…

发布一个简单的npm包简单流程(图文并茂,你必懂)

目录 前言&#xff1a; 1.发布前的代码基本配置 A.创建文件夹 B.npm init/npm init -y初始化项目 C.配置package.json文件 D.创建index.js文件 E.创建README.md文件 F.最基本的目录结构 2.账号注册 3.登录npm账号 A.使用cmd进行登录 B.使用nrm工具 C.成功登录 4.发…

1、浮动(float)

提示&#xff1a;我们一般网页上下用标准流&#xff0c;左右用浮动来写 1.1传统网页布局三种方式 网页布局本质——用css来摆放盒子&#xff0c;把盒子摆放到相应位置。css提供了三种传统布局简单方式&#xff0c;说就是盒子如何进行排列顺序&#xff1a; 普通流&#xff08;或…

面试蚂蚁(P7)竟被MySQL难倒,奋发图强后二次面试入职蚂蚁金服

爱因斯坦说过“耐心和恒心总会得到报酬的”&#xff0c;我也一直把这句话当做自己的座右铭&#xff0c;这句箴言在今年也彻底在“我”身上实现了。 每一个程序员都拥有一座大厂梦&#xff0c;我也不例外&#xff0c;去年面试蚂蚁金服&#xff0c;竟然被MySQL问倒了&#xff0c…

【Flask框架】——16 Jinja2模板

文章目录Jinja2模板一、Jinja2模板介绍1.模板传参2.语法二、表达式三、控制语句1.条件判断语句2.for循环语句&#xff1a;四、过滤器1.什么是过滤器2.字符串的过滤器3.数值过滤器4.列表相关过滤器5.字典相关过滤器6.自定义过滤器五、测试器1.Jinja2中内置的测试器2.自定义测试器…

配置NTP时间同步之Linux

一&#xff1a;NTP是网络时间同步协议&#xff0c;就是用来同步网络中各个计算机的时间的协议。 二&#xff1a;NTP服务端配置 1.检查系统是否安装了NTP包&#xff08;Linux一般自带NTP4.2&#xff09;&#xff0c;没有安装我们直接使用yum命令在线安装&#xff1a; yum inst…

Spring Boot整合Swagger3.0及Knife4j

一、什么是 Swagger Swagger是一组围绕 OpenAPI 规范构建的开源工具&#xff0c;可帮助您设计、构建、记录和使用 REST API。主要的 Swagger 工具包括&#xff1a; Swagger Editor – 基于浏览器的编辑器&#xff0c;您可以在其中编写 OpenAPI 规范。 Swagger UI – 将 OpenA…

非零基础自学Golang 第7章 函数 7.8 知识拓展

非零基础自学Golang 文章目录非零基础自学Golang第7章 函数7.8 知识拓展7.8.1 函数参数传递的本质7.8.2 Go内置函数第7章 函数 7.8 知识拓展 7.8.1 函数参数传递的本质 在讲述参数传递前&#xff0c;我们首先要了解两个基本概念&#xff1a;值传递和引用传递。 值传递&…

API接口DTO测试数据构造的一个方式

自动化测试中&#xff0c;经常需要构造请求参数&#xff0c;例如JSON格式的参数&#xff0c;简单的好说&#xff0c;可以手工修改或是用 Postman、Jmeter 等工具结合简单的代码进行处理&#xff0c; 但当数据传输对象&#xff08;DTO&#xff09;很复杂&#xff0c;部分字段依赖…

同样是项目经理,为啥就干不过他?

早上好&#xff0c;我是老原。 很多人和我抱怨说&#xff0c;做工作太难了&#xff0c;领导针对我&#xff0c;同样都是项目经理&#xff0c;就老是挑我的刺&#xff0c;找我的麻烦。 其实在我看来&#xff0c;工作其实没有那么难&#xff0c;80%的工作问题&#xff0c;都是沟…

C#语言实例源码系列-虚拟键盘

专栏分享点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册 &#x1f449;关于作者 众所周知&#xff0c;人生是一个漫长的流程&#xff0c;不断克服困难&#xff0c;不断反思前进的过程。在这个过程中…

guitar pro8吉他谱软件好用吗?2023GTP全新功能解析

我们常见的GTP格式吉他谱就是用这款软件制作出来的曲谱&#xff0c;也只能用这款软件打开查看。看介绍感觉还不错&#xff0c;原生支持Apple的芯片了。这也是一款能陪着我们一起进步&#xff0c;提升自己的软件。我们在练习吉他等乐器的过程中&#xff0c;音阶与和弦的熟练掌握…