【C++入门到精通】C++的IO流(输入输出流) [ C++入门 ]

在这里插入图片描述

阅读导航

  • 引言
  • 一、C语言的输入与输出
  • 二、流是什么
  • 三、C++IO流
    • 1. C++标准IO流
      • (1)istream
      • (2)ostream
      • (3)iostream
      • (4)cin 和 cout
    • 2. C++文件IO流
      • (1)ifstream
      • (2)ofstream
      • (3)fstream
  • 四、stringstream的简单介绍
  • 温馨提示

引言

C++中的IO流(输入输出流)是程序与外部环境之间进行数据交互的重要手段。通过IO流,程序可以从外部读取数据或将数据输出到外部,实现了程序与用户、其他程序和设备之间的数据传输。C++标准库提供了丰富的IO流类和函数,通过这些类和函数,开发者能够方便地实现各种类型的IO操作。本文将介绍IO流的基本概念和相关类,讲解如何在C++程序中使用IO流实现输入输出操作,并给出相应的示例代码以说明其用法。同时,还将介绍一些常见的IO流操作技巧和使用注意事项,帮助读者更好地掌握和应用C++中的IO流机制。通过学习本文,读者将能够深入理解C++中的IO流,掌握IO流的使用方法,提高程序的输入输出效率和稳定性。

一、C语言的输入与输出

C语言中我们用到的最频繁的输入输出方式就是scanf ()printf()

  • scanf(): 从标准输入设备(键盘)读取数据,并将值存放在变量中
  • printf(): 将指定的文字/字符串输出到标准输出设备(屏幕)

🚨🚨注意宽度输出和精度输出控制

C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
在这里插入图片描述
⭕对输入输出缓冲区的理解:

  1. 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序
  2. 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”

二、流是什么

“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bitbytepacket )的抽象描述。

C++中的流是一种抽象描述,用于表示数据从一个地方(输入设备)流向另一个地方(输出设备)的过程。它描述了数据以有序连续和具有方向性的方式流动的特性。在C++中,流被比喻为信息从外部输入设备(如键盘)向计算机内部(如内存)输入,或者从内存向外部输出设备(如显示器)输出的过程。为了实现这种流动,C++提供了I/O标准类库,其中的每个类都被称为流或流类,用于完成不同方面的输入输出功能。通过使用这些流类,我们可以实现数据的输入和输出操作,实现与外部环境的交互。

🔴C++提供的I/O标准类库

在这里插入图片描述

三、C++IO流

C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
在这里插入图片描述

1. C++标准IO流

C++标准库提供了4个全局流对象cincoutcerrclog使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,coutcerrclogostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。

在这里插入图片描述

(1)istream

istream 是输入流的基类,它提供了从外部读取数据的功能。常用的 istream 类有 istream, ifstream(从文件读取)和 istringstream(从字符串读取)。

⭕常用的 istream 函数包括:

  • get():从流中获取下一个字符并返回其 ASCII 值。
  • getline():从流中读取一行文本,并将其存储在指定的字符串变量中。
  • operator>>:从流中读取数据并将其存储在指定的变量中。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数

(2)ostream

ostream 是输出流的基类,它提供了向外部写入数据的功能。常用的 ostream 类有 ostream, ofstream写入到文件)和 ostringstream写入到字符串)。

⭕常用的 ostream 函数包括:

  • put():向流中写入一个字符。
  • write():向流中写入指定长度的数据。
  • operator<<:向流中写入数据。

例如:

int num = 42;
std::cout << "The answer is: " << num << std::endl; // 输出 "The answer is: 42"

(3)iostream

iostream 是同时具有输入和输出功能的流类,继承自 istreamostream。常用的 iostream 类有 iostreamfstream(用于文件输入输出)和 stringstream(用于字符串输入输出)。

例如:

int num;
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

(4)cin 和 cout

cincout 是预定义的 istreamostream 对象,它们分别用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是屏幕)写入数据。

例如:

int num;
std::cout << "Enter a number: ";
std::cin >> num; // 从标准输入设备读取一个整数
std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"

除此之外,C++标准IO流还提供了一些其他重要的类和函数,如格式化输入输出、流状态检查和文件输入输出等。你可以通过查阅相关文档或教程深入了解更多关于C++标准IO流的知识。

2. C++文件IO流

C++文件IO流是C++标准库提供的用于文件输入和输出的一组类和函数。它们可以用于读取和写入文件中的数据。

⭕C++文件IO流主要涉及以下几个类:

(1)ifstream

ifstream:用于从文件中读取数据的输入流类。通过创建 ifstream 对象,可以打开一个文件并从中读取数据。

⭕常用的 ifstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator>>:从文件中读取数据。

示例代码:

#include <fstream>
#include <iostream>int main() {std::ifstream file("example.txt");if (file.is_open()) {int num;while (file >> num) {std::cout << num << std::endl; // 输出文件中的整数}file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

(2)ofstream

ofstream:用于向文件中写入数据的输出流类。通过创建 ofstream 对象,可以打开一个文件并向其中写入数据。

⭕常用的 ofstream 成员函数有:

  • open():打开指定的文件。
  • close():关闭当前打开的文件。
  • is_open():检查文件是否成功打开。
  • operator<<:将数据写入文件。

示例代码:

#include <fstream>int main() {std::ofstream file("example.txt");if (file.is_open()) {file << "Hello, World!" << std::endl; // 向文件中写入字符串file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

(3)fstream

fstream:同时具有读取和写入功能的文件流类。通过创建 fstream 对象,可以打开一个文件并在其中进行读写操作。

⭕常用的 fstream 成员函数除了可以使用 ifstreamofstream 的成员函数外,还包括:

  • seekg():设置输入位置指针(用于读取)。
  • seekp():设置输出位置指针(用于写入)。

示例代码:

#include <fstream>
#include <iostream>int main() {std::fstream file("example.txt", std::ios::in | std::ios::out);if (file.is_open()) {int num;while (file >> num) {std::cout << num << std::endl; // 从文件中读取整数并输出}file.seekp(0, std::ios::end); // 将输出位置指针移动到文件末尾file << "New data" << std::endl; // 向文件中写入新数据file.close();} else {std::cerr << "Failed to open file." << std::endl;}return 0;
}

在使用文件IO流时,需要包含头文件 <fstream>,并根据需要选择适当的流对象(ifstreamofstreamfstream)。

四、stringstream的简单介绍

stringstream 是 C++ 标准库中的一个流类,它可以像 coutcin 一样进行输入输出操作。不同之处在于 stringstream 不是对控制台进行输入输出,而是对字符串进行输入输出。

stringstream 继承自 istreamostream,因此它既可以进行输入操作,也可以进行输出操作。stringstream 的主要作用是将数据转换为字符串或从字符串中读取数据。使用 stringstream 可以方便地进行格式化输出和解析字符串。

stringstream 的头文件是 <sstream>,它定义了以下三个类:

  • std::istringstream:从字符串中读取数据的输入流。
  • std::ostringstream:将数据输出到字符串的输出流。
  • std::stringstream:既可以输入数据,也可以输出数据的流。

使用 stringstream 进行输入输出操作的一般流程如下:

  1. 创建 stringstream 对象

可以使用默认构造函数创建一个空的 stringstream 对象,例如:

std::stringstream ss;
  1. 输入数据

可以使用运算符 << 将数据写入 stringstream 中,例如:

int num = 123;
std::string str = "hello";
ss << "The number is: " << num << ", the string is: " << str;
  1. 输出数据

可以使用成员函数 str()str(std::string&) 获取 stringstream 所包含的字符串,例如:

std::string output = ss.str();
std::cout << output << std::endl; // 输出:The number is: 123, the string is: hello
  1. 解析字符串

可以使用运算符 >>stringstream 中读取数据,例如:

std::string input = "123 4.56 hello";
int num;
double d;
std::string str;
ss.clear(); // 清空 stringstream 对象
ss.str(input);
ss >> num >> d >> str;
std::cout << num << " " << d << " " << str << std::endl; // 输出:123 4.56 hello

🚨🚨注意:在读取数据之前应该先清空 stringstream 对象,并使用成员函数 str(std::string&) 将要解析的字符串写入 stringstream

温馨提示

感谢您对博主文章的关注与支持!另外,我计划在未来的更新中持续探讨与本文相关的内容,会为您带来更多关于C++以及编程技术问题的深入解析、应用案例和趣味玩法等。请继续关注博主的更新,不要错过任何精彩内容!

再次感谢您的支持和关注。期待与您建立更紧密的互动,共同探索C++、算法和编程的奥秘。祝您生活愉快,排便顺畅!

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

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

相关文章

028 方法的重载

方法重载的定义 使用案例 public static void main(String[] args) {// 匹配到max(int a, int b)System.out.println(max(1, 3));// 匹配到max(double a, double b)System.out.println(max(1L, 3L));// 匹配到max(double a, double b, double c, double d)&#xff0c;int自动…

服了,一个ThreadLocal被问出了花

分享是最有效的学习方式。 博客&#xff1a;https://blog.ktdaddy.com/ 故事 地铁上&#xff0c;小帅无力地倚靠着杆子&#xff0c;脑子里尽是刚才面试官的夺命连环问&#xff0c;“用过TheadLocal么&#xff1f;ThreadLocal是如何解决共享变量访问的安全性的呢&#xff1f;你…

手机gif动图怎么操作?这个方法分分钟解决

手机上怎么制作gif动画&#xff1f;Gif动图是当下非常流行的一种表达方式&#xff0c;通过简单的画面循环就能够传达您的想法。但是&#xff0c;想要在手机上制作gif动画的时候应该怎么办呢&#xff1f;通过会用GIF动图在线编辑&#xff08;https://www.gif.cn/&#xff09;工具…

【循环结构·js】

变量命名原则 变量名由字母、下划线、$ 或数字组成&#xff0c;并且必须由字母、下划线、$ 开头。 变量名不能命名为系统关键字和保留字。 JS代码在sourse里面调试 document.write(str); /*在页面上输出变量 str 的值*/数据类型的分类 为什么要标识数据类型&#xff1a; 不…

Kubernetes Pod使用

Pod是Kubernetes中可以创建、调度和部署的最小&#xff0c;也是最简单的单元。Pod是基于Kubernetes部署和运维应用的基础。本文重点介绍下Pod各字段的含义及Pod的使用&#xff0c;关于Pod更多的知识细节可以参考Kubernetes Pod详解一文。 本文参考的主要内容来源于Kubernetes 1…

设计模式——2_1 命令(Command)

文章目录 定义图纸一个例子&#xff1a;空调和他的遥控器只有控制面板的空调遥控器可以撤销的操作 碎碎念命令和Runnable命令和事务 定义 把请求封装成一个对象&#xff0c;从而使你可以用不同的请求对客户进行参数化&#xff0c;对请求排队或记录请求日志&#xff0c;以及支持…

Linux文件结构

所有Linux系统的文件结构都是一样的&#xff0c;区别于win系统的c盘&#xff0c;d盘&#xff0c;他只有一个根目录“/”&#xff0c;下面的文件夹结构基本是一样的&#xff0c;如下&#xff0c;文件夹有“箭头”代表的是软链接&#xff0c;即该文件夹的位置不在此&#xff0c;右…

小米平板6获取root权限教程

1. 绑定账号 1> 打开"设置-我的设备-全部参数-连续点击MIUI版本按钮"&#xff0c;直到提示已打开开发者模式( p s : 这里需要重点关注红框平板型号和 M I U I 版本&#xff0c;例如我这里平板型号是 X i a o m i P a d 6 &#xff0c; M I U I 版本是 14.0.10 &am…

【开源】JAVA+Vue+SpringBoot实现就医保险管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 科室档案模块2.2 医生档案模块2.3 预约挂号模块2.4 我的挂号模块 三、系统展示四、核心代码4.1 用户查询全部医生4.2 新增医生4.3 查询科室4.4 新增号源4.5 预约号源 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVue…

酷开系统 | 酷开科技智慧AI带你领略神奇的世界

在这个科技日新月异的时代&#xff0c;AI已成为我们生活中不可或缺的一部分。它不仅改变了我们的生活方式&#xff0c;更让我们对未来充满期待。说起酷开系统中智慧AI的强大&#xff0c;着实让人叹为观止。无论是语音识别、数据整理还是语言处理&#xff0c;智慧AI都在不断地突…

MySQL数据库①_MySQL入门(概念+使用)

目录 1. 数据库的概念 1.1 数据库的存储介质 1.2 主流数据库 2. MySQL的基本使用 2.1 链接数据库 2.2 服务器管理 2.3 数据库&#xff0c;服务器和表关系 2.4 简单MySQL语句 3. MySQL架构 4. SQL分类 5. 存储引擎 本篇完。 1. 数据库的概念 数据库是按照数据结构来…

测试大佬是怎么看待测试用例设计的

前言 最近干的最多的事情就是设计测试用例、评审测试用例了&#xff0c;于是我不禁又想到了一个经典的问题&#xff1a;如何设计出优秀的测试用例&#xff1f; 可能有些童鞋看到这个问题会有些不以为然&#xff0c;这有什么好想的&#xff1f;干个测试谁还不会设计测试用例&…

C++(10)——类与对象(最终篇)

目录 static成员 概念 特性 友元 友元函数 友元类 内部类 匿名对象 经过这么多天的分享&#xff0c;C的类与对象终于要结束了。结束也意味着C快要入门了。 static成员 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之…

基于YOLOv8算法的照片角度分类项目实践

目录 一、任务概述二、YOLOv8算法简介2.1 算法改进2.2 算法特点2.3 网络结构2.4 性能比较 三、工程实践3.1 安装算法框架库ultralytics3.2 库存照片预处理3.2.1 提取所有图片3.2.2 去除冗余的相同照片3.2.3 去除无车辆照片3.2.4 随机提取指定数量的图片 3.3 照片朝向分类3.3.1 …

STM32--USART串口(2)串口外设

一、USART简介 可配置数据位&#xff1a;不需要校验就是8位&#xff0c;需要校验就选9位&#xff1b; 停止位&#xff1a;决定了帧的间隔; STM32F103C8T6USART&#xff1a;USART1挂载在APB2总线上&#xff0c;USART2和USART3挂载在APB1总线上&#xff1b; 二、USART框图 TXE…

excel给数据库初始化/旧数据处理(自动sql拼装)

思路&#xff1a; 首先导出数据到excel编写单条数据操作的sql利用excel CONCATENATE 函数自动生成&#xff0c;每一行数据的操作sql 小技巧:对于需要套娃的字段值&#xff0c;可以加一个临时列同样使用CONCATENATE函数进行sql拼装 案例&#xff1a; 1.临时列:CONCATENATE(C2, …

分库分表 21 条法则,hold 住!

大家好&#xff5e;今天给大家分享分库分表的 21 条法则 我们结合具体业务场景&#xff0c;以t_order表为例进行架构优化。由于数据量已经达到亿级别&#xff0c;查询性能严重下降&#xff0c;因此我们采用了分库分表技术来处理这个问题。具体而言&#xff0c;我们将原本的单库…

【Python小游戏】五子棋小游戏(完整代码)

文章目录 写在前面Tkinter简介五子棋小游戏游戏介绍程序设计运行结果注意事项写在后面写在前面 本期内容:基于tkinter开发一个五子棋小游戏 实验环境 python3.11及以上pycharmtkinterTkinter简介 Tkinter是Python中最常用的图形用户界面(GUI)库之一,用于创建窗口、对话框…

如何搭建私有云盘SeaFile并实现远程访问本地文件资料

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-hsDnDEybLME85dTx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

Web项目利用OSS进行图像存储服务

一、OSS介绍 在Web项目中&#xff0c;一些常见的功能&#xff0c;比如展示图片&#xff0c;修改头像等&#xff0c;都需要进行图片的上传操作&#xff0c;但是如果是存储在Web服务器中&#xff0c;在读取图片的时候会占用比较多的资源&#xff0c;影响服务器的性能。 常…