输入输出缓冲区的作用,c++io流介绍,转换运算符(operator+类型)

news2024/9/27 7:22:54

目录

引入

输入输出缓冲区的作用

c++io流

介绍

为什么要把流进行面向对象的设计呢?

原理

使用的注意点

istream类型对象转换为逻辑条件判断值

引入

转换运算符

文件io

介绍

示例

注意点

说明

利用字节流特性 

字符串io

介绍

istringstream

ostringstream

示例


引入

在原先c语言中,我们一般使用scanf和printf来进行输入输出,并且有输入输出缓冲区的存在

(代码实际上应该是底层中的内存)

输入输出缓冲区的作用

  • 它可以让原本没有"行"概念的计算机在解析缓冲区内容后,返回一个"行"
  • 不同的操作系统和环境可能有不同的底层 I/O 实现方式,但通过使用标准库函数和输入输出缓冲区,程序员可以将底层的实现细节隐藏起来,使程序在不同平台上运行更加可靠和可移植
  • 通过在内存中累积一定量的数据,程序可以减少频繁的 I/O 操作,从而提高效率

而这种数据运输的过程,被比喻为""

  • (来源于 -- 如何理解编程语言中「流」(stream)的概念? - 知乎 (zhihu.com))
  • 流是一种抽象概念,它表示数据的有序序列,这些数据可以被读取、写入或处理,数据可以是各种类型的,这些序列形成一个数据传输通道(可以理解为是一个管道),程序可以逐个字节或块地读取和写入数据,而不必关心数据的来源或去向
  • 它可以描述 数据在 程序 和 外部源/目标 之间的传输
  • 流分为两种,输入流用于从[外部源]读取数据存入[计算机内部],而输出流用于将数据写入[外部设备]
  • 其中,C语言的标准库提供的用于处理输入输出的函数,可以被认为是操作流的接口
  • 而在C++中,也引入了面向对象的流库,其中流对象成为了数据输入和输出的关键接口

c++io流

介绍

  • 其中,流被抽象成类的对象
  • c++的io流库形成了一个庞大的继承体系,最基本的基类是ios_base,在这之上派生出各种类
  • 一般我们是使用iostream中的cin,cout全局流对象进行输入输出操作(其中c表示console,意思是控制台)

​​​​​​​

  • c中有fscanf/fprintf等f系列函数,用于处理文件;有sscanf/sprintf等s系列函数,用于处理字符串
  • 所以c++也沿用了这个设计,fstream包括了对文件进行io的函数,sstream包括了对字符串进行io的函数

为什么要把流进行面向对象的设计呢?

  • 因为在c中,无法直接向自定义类型输入输出,它提供的接口都是针对内置类型
  • 所以在c++中增加了自定义类型直接和控制台交互的操作(也就是面向对象的设计)
  • 这样把流对象化,可以让"流"这个概念更加形象(cin>>a ,把输入流的内容流入到a中;cout<<a,把a流入到输出流中)
原理
  • 实际上,自定义类型的io操作是通过重载运算符<<和>>实现的
  • 并且,c++中的cin,cout不是可以自动识别类型吗
  • 实际上是通过函数重载实现的

使用的注意点

  • 输入的数据类型必须与要提取的数据类型一致,否则出错
  • 出错只是在流的状态字state中对应位置位(置1),程序继续
  • 空格和回车都可以作为数据之间的分格符,所以多个数据可以在一行输入,也可以分行输入,如果需要读取整个行,包括空格,可以使用getline函数

istream类型对象转换为逻辑条件判断值

引入

  • 多行输入可以用while(cin>>n)来实现,为什么呢?
  • 是因为通过重载的>>,返回一个cin对象的引用
  • 而这个引用可以作为while的条件,也就意味着cin可以被转换为bool值
  • 这个转换依靠了这个函数:
  • 而这个函数就是c++中的转换运算符

转换运算符

转换运算符是用于定义 类类型 到 另一种数据类型 的自定义转换的特殊成员函数

格式 : operator+类型名

class MyClass {
public:
    operator int() {
        return someValue;
    }
private:
    int someValue;
};
class MyClass {
public:
    operator AnotherClassType() {
        AnotherClassType result;
        // Define the logic to create and initialize result
        return result;
    }
};

所以一个简单的while(cin>>n)实际的调用过程:

  • cin调用operator>>,去流中提取数据,然后返回一个istream&
  • 这个对象调用operator bool,如果接收流失败,或者有结束标志,则返回false,其他返回true
  • 然后这个bool值作为while的判断条件

文件io

介绍

c++根据文件内容的数据格式分为二进制文件文本文件,基本上和c一样
c++ 标准库中有许多不同的标志,用于指定流对象的行为,可以组合在一起以设置不同的模式:
采用文件流对象操作文件的一般步骤:
  • 定义一个文件流对象
  • ifstream ifile(只输入用)
  • ofstream ofile(只输出用)
  • fstream iofile(既输入又输出用)
  • 使用文件流对象的成员函数打开一个磁盘文件,使得文件流对象和磁盘文件之间建立联系
  • 使用提取和插入运算符对文件进行读写操作,或使用成员函数进行读写
  • 关闭文件

示例

#include<iostream>
#include<fstream>
#include<sstream>
#include<string>

using namespace std;

struct info_data {
	char _data[50]; //不能使用string/vector
	int _port;
};

class information {
public:
	//ifstream& operator<<()
	information(const string& arr) //我们的文件操作首先需要一个文件路径
		:_filename(arr){}

	void  b_read(info_data& info) {
		ifstream i(_filename, ios_base::in | ios_base::binary);//用二进制读方式打开
		i.read((char*)&info, sizeof(info));//将流中数据读入info中
		i.close();
	}
	void b_write(const info_data& info) {
		ofstream i(_filename, ios_base::out | ios_base::binary| ios_base::app);//用二进制追加写方式打开
		i.write((const char*)&info, sizeof(info));//将info写入流中
		i.write("\n", sizeof("\n"));
		i.close();
	}

	void t_read(info_data& info) {
		ifstream i(_filename);
		i >> info._data >> info._port;//将流中数据读入info中
		i.close();
	}
	void t_write(const info_data& info) {
		ofstream i(_filename, ios_base::out | ios_base::app);//追加方式
		i << info._data << " " << info._port<<endl;
    //将info写入流中(可以在中间加入空格和换行符,这样存入文件中的数据更易懂)
		i.close();
	}
private:
	string _filename;
};

int main() {
	information t("test.txt");

    //文本方式读写
	info_data data;
	t.t_write({ "hello",80 });
	t.t_read(data);

    //二进制方式读写
	info_data tmp;
	t.b_write({ "hello",80 });
	t.b_read(tmp);
	cout << tmp._data << " " << tmp._port << endl;

	return 0;
}

文件内容:

代码执行结果:

tmp实际存放数值:

注意点
  • 如果用string/vector存储数据(也就是字符串),一旦字符串长度有点长,就会在堆上开辟空间存放数据,只会存储一个地址指向那块空间,那存入文件的也是那个地址
  • 但下次程序执行,读取文件时,会读取到上次运行时生成的地址,在这次就是无效地址,越界访问了
  • 注意,打开文件之后,如果不需要它了, 最好显式关闭文件
说明
  • 文本读取时,是按行读取;而二进制读取是读整个文件,所以tmp的_data成员是写入的所有字符,_port被默认初始化为0
  • 二进制存入的内容大概率我们都是看不懂的,所以如果需要文件能读懂,最好是文本读写

利用字节流特性 

void test3() {
	ifstream i("code.cpp");
	char c;
	while (i.get(c)) {
		cout << c;
	}
}

利用文件中存储的数据是字节流形式,可以通过get函数获取字符,然后把某个文件全部读出

字符串io

介绍

istringstream
  • 可以从一个字符串中提取数据
  • 也是一种反序列化的过程,通常包括从字节流中读取数据,解码数据并将其还原为原始数据结构的字段
ostringstream
  • 将数据格式化为字符串,可以像输出到标准输出流一样来构建字符串
  • 属于简单序列化的过程,序列化过程通常包括将数据的字段按照一定的协议编码为字节流,并将其写入文件或通过网络发送
  • 最后通过str()成员函数来获取格式化后的字符串

示例

void test2() {
	int a = 1;
	double b = 1.1;
	ostringstream o;//格式化写入
	o << a << " " << b;
	string str = o.str();
	cout << str << endl;

	ofstream i("test.txt", ios_base::out | ios_base::app);//将字符串写入文件
	i << str << endl;
	i.close();
}

文件内容:

代码结果:

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

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

相关文章

七、【图像添加水印】

文章目录 一、制作水印1、先新建图层2、新建文字图层并调好水印文字的大小与角度3、添加图层样式4、添加定义图案 二、添加水印 一、制作水印 1、先新建图层 2、新建文字图层并调好水印文字的大小与角度 3、添加图层样式 1、打开“描边” 2、选择“颜色” 4、添加定义图案 二…

【AI视野·今日NLP 自然语言处理论文速览 第六十期】Mon, 23 Oct 2023

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 23 Oct 2023 (showing first 100 of 108 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Exploring Linguistic Probes for Morphological Generalization Autho…

电商数据采集抓取封装数据、淘宝、天猫、京东等平台商品详情API接口参数详解

电商数据采集抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电商数据…

Android开发笔记(三)—Activity篇

活动组件Activity 启动和结束生命周期启动模式信息传递Intent显式Intent隐式Intent 向下一个Activity发送数据向上一个Activity返回数据 附加信息利用资源文件配置字符串利用元数据传递配置信息给应用页面注册快捷方式 启动和结束 &#xff08;1&#xff09;从当前页面跳到新页…

数据库软考知识

分布式数据库透明性 封锁 加上共享锁之后只能加共享锁&#xff0c;加上排他锁之后&#xff0c;啥锁都不能加。 分布式数据库特性 伪传递定理 SQL函数定义&#xff0c;有点冷 来了奥&#xff0c;更冷 存储过程 很重要&#xff0c;下午第二大题也是数据库

解决QtCreator11及更高版本使用JDK17时无法生成APK

1.修改gradle文件&#xff0c;增加如下内容&#xff1a; DEFAULT_JVM_OPTS"-Xmx5120m --add-exportsjava.base/sun.nio.chALL-UNNAMED \ --add-opensjava.base/java.langALL-UNNAMED \ --add-opensjava.base/java.lang.reflectALL-UNNAMED \ --add-opensjava.base/java.io…

用户优先:确保微信小程序手机号授权在新旧版本中无缝衔接

&#x1f52d; 嗨&#xff0c;您好 &#x1f44b; 我是 vnjohn&#xff0c;在互联网企业担任 Java 开发&#xff0c;CSDN 优质创作者 &#x1f4d6; 推荐专栏&#xff1a;Spring、MySQL、Nacos、Java&#xff0c;后续其他专栏会持续优化更新迭代 &#x1f332;文章所在专栏&…

SQL注入——二次注入漏洞

文章目录 SQL注入——二次注入漏洞1. 二次注入原理2. 二次注入需要具备的两个条件3. 二次注入实例4. 总结 SQL注入——二次注入漏洞 1. 二次注入原理 在第一次插入恶意数据的时候&#xff0c;只是对其中的特殊字符进行了转义&#xff0c;在写入数据库的时候还是原来的字符&am…

9.多线程之定时器与线程池

定时器与线程池 文章目录 定时器与线程池1. 定时器1.1 定时器的工作原理1.2 定时器的使用2.3 实现定时器 2. 线程池2.1 线程池存的优点2.2 线程池的使用2.3 线程池的原理2.3.1 工厂模式2.3.2 ThreadPoolExecutor类 2.4 实现线程池 1. 定时器 定时器也是软件开发中的一个重要组件…

【GEE】Google Earth Engine(GEE)注册详细教程无需教育邮箱

这个专栏真的是纠结了很久&#xff0c;不知道到底要不要分享自己在学习GEE的时候的一些经验和代码。因为本人在日常中使用Python和ENVI多点&#xff0c;虽然GEE也会用但不至于频繁使用&#xff0c;同时针对GEE其实官网给出了很多接口的使用方法&#xff0c;国内外也有很多人分享…

编译正点原子LINUXB报错make: arm-linux-gnueabihf-gcc:命令未找到

编译正点原子LINUXB报错make: arm-linux-gnueabihf-gcc&#xff1a;命令未找到 1.报错内容2.解决办法3./bin/sh: 1: lzop: not found4.编译成功 1.报错内容 make: arm-linux-gnueabihf-gcc&#xff1a;命令未找到CHK include/config/kernel.releaseCHK include/genera…

全面提升企业管理效率,助力企业持续增长——三叠云进销存解决方案

企业在生产经营过程中&#xff0c;高效的进销存管理是企业成功的关键因素之一。它不仅能够优化企业的资金流动&#xff0c;避免库存积压和断货现象&#xff0c;提高客户满意度&#xff0c;而且可以优化供应链&#xff0c;减少运营成本&#xff0c;提高生产和物流效率。三叠云正…

C语言 数据的存储2

如图所示代码&#xff1a; 代码运行结果为&#xff1a; 这是什么原因呢&#xff1f; 解析: 因为unsigned int是无符号整形&#xff0c;而我们的for循环的条件是 所以我们会一直循环下去&#xff0c;至于我们的结果为什么会是 一个unsigned int类型是4个字节&#xff0c;38位&am…

论文范文:论基于架构的软件设计方法及应用

注意:范文只适用于帮助大家打开写作思路,并不能作为素材直接用于平时练习、考试中。考试中直接使用范文的素材,会有被认定为雷同卷的风险。 摘要: 2022年4月,本人所在单位计划研发生态集装箱管理控制平台项目。该平台主要用于与现有公司生态集装箱产品做对接,达到远程控制…

【AI视野·今日Robot 机器人论文速览 第六十期】Mon, 23 Oct 2023

AI视野今日CS.Robotics 机器人学论文速览 Mon, 23 Oct 2023 Totally 26 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Robotics Papers A Review of Prospects and Opportunities in Disassembly with Human-Robot Collaboration Authors Meng Lun Lee, Xiao Lian…

vscode开启emmet语法

需要在setting.json中添加配置 首先进入设置&#xff0c;然后点击右上角 Vue项目添加如下配置 "emmet.syntaxProfiles": { "vue-html": "html", "vue": "html" },React项目添加如下配置 "emmet.includeLanguages&quo…

Google搜索中,搜索关键词的技巧

最近在b站看到一个关于搜索的视频&#xff0c;感觉比较有用&#xff0c;先mark下来 1、巧用限定关键词符号""&#xff0c;也就是用英文的双引号&#xff0c;去搜索包含搜索词及这个搜索词字序的搜索结果。 如搜索 "菊花茶"&#xff0c;这个有用的点在于…

OpenCV官方教程中文版 —— Hough 圆环变换

OpenCV官方教程中文版 —— Hough 圆环变换 前言Hough 圆环变换 前言 目标 • 学习使用霍夫变换在图像中找圆形&#xff08;环&#xff09; • 学习函数&#xff1a;cv2.HoughCircles() Hough 圆环变换 opencv_logo.png&#xff1a; # -*- coding: utf-8 -*- import cv2 …

生态系统服务(InVEST模型)的人类活动、重大工程生态成效评估、论文写作等具体应用

以InVEST模型结合实际项目进行由浅入深的实战技术培训&#xff0c;Ai尚研修针对11期InVEST模型实践技术会议参会学者的特点及需求进行分析&#xff0c;融合课程体系&#xff0c;对接工作实际项目及论文写作&#xff0c;解决参会者关注的重点及实际项目过程问题&#xff0c;课程…

C++新经典 | 记录在最后的高阶知识点

目录 一、函数调用运算符与function类模板 1.函数调用运算符 &#xff08;1&#xff09;函数类型 &#xff08;2&#xff09;可调用对象 2.function类模板 二、万能引用类型 1.万能引用 2.万能引用资格的剥夺与辨认 &#xff08;1&#xff09;const修饰词 &#xff0…