引言
C++中的IO流(输入输出流)是程序与外部环境之间进行数据交互的重要手段。通过IO流,程序可以从外部读取数据或将数据输出到外部,实现了程序与用户、其他程序和设备之间的数据传输。C++标准库提供了丰富的IO流类和函数,通过这些类和函数,开发者能够方便地实现各种类型的IO操作。本文将介绍IO流的基本概念和相关类,讲解如何在C++程序中使用IO流实现输入输出操作,并给出相应的示例代码以说明其用法。同时,还将介绍一些常见的IO流操作技巧和使用注意事项,帮助读者更好地掌握和应用C++中的IO流机制。通过学习本文,读者将能够深入理解C++中的IO流,掌握IO流的使用方法,提高程序的输入输出效率和稳定性。
一、C语言的输入与输出
C语言中我们用到的最频繁的输入输出方式就是scanf ()
与printf()
。
scanf()
: 从标准输入设备(键盘)读取数据,并将值存放在变量中。
printf()
: 将指定的文字/字符串输出到标准输出设备(屏幕)。
🚨🚨注意宽度输出和精度输出控制
C语言借助了相应的缓冲区来进行输入与输出。如下图所示:
⭕对输入输出缓冲区的理解:
- 可以屏蔽掉低级I/O的实现,低级I/O的实现依赖操作系统本身内核的实现,所以如果能够屏蔽这部分的差异,可以很容易写出可移植的程序。
- 可以使用这部分的内容实现“行”读取的行为,对于计算机而言是没有“行”这个概念,有了这部分,就可以定义“行”的概念,然后解析缓冲区的内容,返回一个“行”。
二、流是什么
“流”即是流动的意思,是物质从一处向另一处流动的过程,是对一种有序连续且具有方向性的数据( 其单位可以是bit
,byte
,packet
)的抽象描述。
C++中的流是一种抽象描述,用于表示数据从一个地方(输入设备)流向另一个地方(输出设备)的过程。它描述了数据以有序连续和具有方向性的方式流动的特性。在C++中,流被比喻为信息从外部输入设备(如键盘)向计算机内部(如内存)输入,或者从内存向外部输出设备(如显示器)输出的过程。为了实现这种流动,C++提供了I/O标准类库,其中的每个类都被称为流或流类,用于完成不同方面的输入输出功能。通过使用这些流类,我们可以实现数据的输入和输出操作,实现与外部环境的交互。
🔴C++提供的I/O标准类库
三、C++IO流
C++系统实现了一个庞大的类库,其中ios为基类,其他类都是直接或间接派生自ios类
1. C++标准IO流
C++标准库提供了4个全局流对象cin、cout、cerr、clog,使用cout进行标准输出,即数据从内存流向控制台(显示器)。使用cin进行标准输入即数据通过键盘输入到程序中,同时C++标准库还提供了cerr用来进行标准错误的输出,以及clog进行日志的输出,从上图可以看出,cout、cerr、clog是ostream类的三个不同的对象,因此这三个对象现在基本没有区别,只是应用场景不同。
(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
是同时具有输入和输出功能的流类,继承自 istream
和 ostream
。常用的 iostream
类有 iostream
、fstream
(用于文件输入输出)和 stringstream
(用于字符串输入输出)。
例如:
int num; std::cin >> num; // 从标准输入设备读取一个整数 std::cout << "You entered: " << num << std::endl; // 输出 "You entered: 42"
(4)cin 和 cout
cin
和 cout
是预定义的 istream
和 ostream
对象,它们分别用于从标准输入设备(通常是键盘)读取数据和向标准输出设备(通常是屏幕)写入数据。
例如:
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
成员函数除了可以使用 ifstream
和 ofstream
的成员函数外,还包括:
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>
,并根据需要选择适当的流对象(ifstream
、ofstream
或 fstream
)。
四、stringstream的简单介绍
stringstream 是 C++ 标准库中的一个流类,它可以像 cout 和 cin 一样进行输入输出操作。不同之处在于 stringstream 不是对控制台进行输入输出,而是对字符串进行输入输出。
stringstream 继承自 istream 和 ostream,因此它既可以进行输入操作,也可以进行输出操作。stringstream 的主要作用是将数据转换为字符串或从字符串中读取数据。使用 stringstream 可以方便地进行格式化输出和解析字符串。
⭕stringstream
的头文件是 <sstream>
,它定义了以下三个类:
std::istringstream
:从字符串中读取数据的输入流。std::ostringstream
:将数据输出到字符串的输出流。
std::stringstream
:既可以输入数据,也可以输出数据的流。
使用 stringstream
进行输入输出操作的一般流程如下:
- 创建
stringstream
对象
可以使用默认构造函数创建一个空的 stringstream
对象,例如:
std::stringstream ss;
- 输入数据
可以使用运算符 <<
将数据写入 stringstream
中,例如:
int num = 123; std::string str = "hello"; ss << "The number is: " << num << ", the string is: " << str;
- 输出数据
可以使用成员函数 str()
或 str(std::string&)
获取 stringstream
所包含的字符串,例如:
std::string output = ss.str(); std::cout << output << std::endl; // 输出:The number is: 123, the string is: hello
- 解析字符串
可以使用运算符 >>
从 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++、算法和编程的奥秘。祝您生活愉快,排便顺畅!