【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.hqwc.cn/news/450093.html

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

相关文章

苹果的ipad可能会缓存vue项目的数据或者pinia数据

如果你发现开发的vue项目在ipad上出现了异常&#xff0c;比如数据出现NaN的情况&#xff0c;或者computed计算属性没生效&#xff0c;或者pinia里面的数据没生效&#xff0c;可能就是ipad浏览器safari缓存了数据导致的&#xff0c;只需要清空safari里面缓存的数据就可以了&…

日志追踪-Tracing

1. 前言 分布式链路跟踪中有两个重要的概念&#xff1a;跟踪&#xff08;trace&#xff09;和 跨度&#xff08; span)。trace 是请求在分布式系统中的整个链路视图&#xff0c;span 则代表整个链路中不同服务内部的视图&#xff0c;span 组合在一起就是整个 trace 的视图在整个…

MacBook Pro (15 英寸,2018) 本地体验运行 6B 大模型

接上篇 在 Mac 上加速 PyTorch 训练&#xff0c;准备完 MPS 环境之后&#xff0c;开始在本地体验 ChatGLM3-6B 模型。 一、下载本仓库&#xff1a; (base) markvivvMBP dev % git clone https://github.com/THUDM/ChatGLM3Cloning into ChatGLM3... remote: Enumerating obje…

C++并发编程 -2.线程间共享数据

本章就以在C中进行安全的数据共享为主题。避免上述及其他潜在问题的发生的同时&#xff0c;将共享数据的优势发挥到最大。 一. 锁分类和使用 按照用途分为互斥、递归、读写、自旋、条件变量。本章节着重介绍前四种&#xff0c;条件变量后续章节单独介绍。 由于锁无法进行拷贝…

数字孪生产品评测:五款数字孪生产品的优劣对比

作为数据可视化领域的资深用户&#xff0c;我深知数字孪生产品在当今工业4.0时代的重要地位。本文将为大家介绍五款市面上的数字孪生产品&#xff0c;帮助大家了解各产品之间的优缺点&#xff0c;选择适合自己的产品。 一、山海鲸可视化 山海鲸可视化是一款强大而灵活的免费数…

npm install一直报错 failed, reason: certificate has expired

刚开始我以为是taobao镜像源的问题&#xff0c;所以我把npm的地址切换成了 https://resgistry.npmjs.org/ &#xff0c;发现还是不行。 问题解决&#xff1a; npm config set strict-ssl false 执行上面命令之后&#xff0c;npm install 成功

C# 读取文件中的配置信息

文章目录 定义使用文件格式代码 C#读取文件并处理&#xff1b;C# 读取文件中的配置信息。 在有的程序中&#xff0c;需要从本地文件中读取配置信息&#xff0c;以进行初始化。 定义 定义一个静态函数来获取文件信息。StreamReader 类。 /// <summary> /// 读取参数文件…

记一次 Android CPU高使用率排查

文章目录 背景排查高占用的进程adb shelltoptop -b -H -n 1 | grep 29337 (打印各线程 cpu使用详情)kill -3 29337 (生成trace文件)adb pull /data/anr /Users/gerry.liang/Desktop定位问题 补充说明: 背景 测试同学反馈我们的App CPU使用率 90% 居高不下,经过一番艰难的排查后…

【问题解决】VSCode1.86.0版+拓展Remote-SSHv0.108 无法连接到VSCode服务器(VSCode无法远程连接到Linux)

作者在下午五点左右照常通过VSCode远程连接Ubuntu主机编写代码&#xff0c;突然在一次重启VSCode后&#xff0c;不管如何尝试都连接不到Linux主机&#xff0c;首先自己尝试了重启电脑&#xff0c;无效&#xff1b;然后尝试通过其他软件&#xff08;XShell和Xftp&#xff09;远程…

鸿蒙应用开发-自定义可删除列表弹窗

功能介绍&#xff1a; 自定义列表弹窗&#xff0c;可以对弹窗的列表点击删除&#xff0c;参考文档创建列表&#xff0c;自定义弹窗文档自定义弹窗&#xff08;CustomDialog&#xff09;。 知识点&#xff1a; 熟悉对List控件的使用。熟悉对List点击删除熟悉自定义弹窗。 使…

算法:阿里巴巴找黄金宝箱(II)

一、算法描述 题目描述 一贫如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;无意中发现了强盗集团的藏宝地&#xff0c;藏宝地有编号从0-N的箱子&#xff0c; 每个箱子上面贴有箱子中藏有金币Q的数量。 从金币数量中选出一个数字集合&#xff0c; 并销毁贴有这些数字的每个箱子&…

20240203在WIN10下安装Anaconda

20240203在WIN10下安装Anaconda 2024/2/3 20:45 缘起&#xff1a;最近学习stable-diffusion-webui.git&#xff0c;在Ubuntu20.04.6下配置SD成功。 不搞精简版本&#xff1a;Miniconda了。直接上Anacoda&#xff01; 百度搜索&#xff1a;Anaconda 下载 https://www.anaconda.c…