1、istream 和 ostream
1.1、istream类
istream 类用于从尺度输入设备(比方键盘)或其他输入设备(如文件)读取数据,它是所有输入流类的基类。
常用的成员函数:
operator>>:提取运算符,用于从输入流中提取数据。
>> 的实现原理:
在 ostream 类中,<< 操作符被重载为一个函数,该函数可以或许处理各种类型的输出,比如整型、浮点型、字符串等。每次利用 << 时,数据都会传递给该运算符函数,终极输出到流所指向的设备上(如终端或文件)。典型的输出运算符重载形式为:
- std::ostream& operator<<(std::ostream& os, int value);
- std::ostream& operator<<(std::ostream& os, double value);
- std::ostream& operator<<(std::ostream& os, const char* str);
复制代码 链式调用的原理:
<< 操作符的返回值是对输出流对象本身的引用(std:stream&),这使得链式调用成为可能。如下面例子,std::cout << "x = " 返回的是 std:stream&,接着 x 通过下一个 << 操作符继续输出。
- std::cout << "x = " << x << ", y = " << y;
复制代码 get():从输入流中获取一个字符或字符数组。
- char ch;
- std::cin.get(ch); // 读取一个字符
复制代码 getline():从输入流中读取一行字符串。
- std::string line;
- std::getline(std::cin, line); // 读取一行字符串
复制代码 1.2、ostream 类
ostream 类用于将数据输出到尺度输出设备(比方屏幕)或其他输出设备,它是所有输出流类的基类。
常用的成员函数:
operator<<:插入运算符,用于将数据输出到流中(实现原理与 >> 类似)。
put():输出一个字符。
- std::cout.put('A'); // 输出字符 'A'
复制代码 write():输出一系列字符。
- char str[] = "C++ Programming";
- std::cout.write(str, sizeof(str)); // 输出字符串
复制代码 2、iostream
iostream 类是 istream 和 ostream 的派生类,可以或许同时执行输入和输出操作,通常用于文件或其他双向通讯的场景。
为什么不直接设计一个 iostream,转而先设计 istream 和 ostream 呢?
- 在设计流类时,将输入和输出职责分开,使每个类的职责更加明确,便于理解和维护。这符合单一职责原则,即每个类应该只负责一件事情。
- 分离 istream 和 ostream 为两个独立的类为以后的扩展提供了更大的机动性。比方ifstream 类只必要处理文件输入,它只需继续 istream 即可,而 ofstream 类只处理文件输出,它继续自 ostream。在某些特别情况下,程序既必要处理输入也必要处理输出,iostream 就发挥了作用(fstream 同时用于文件读写)。
2.1、尺度输入输出对象
在 iostream 库中,已经定义了一些常用的全局流对象:
- std::cin:尺度输入流,通常与键盘关联,用于从尺度输入读取数据。
- std::cout:尺度输出流,通常与显示器关联,用于向尺度输出设备(屏幕)输出数据。
- std::cerr:尺度错误输出流,通常与显示器关联,用于输堕落误信息,不带缓冲。
- std::clog:尺度日志输出流,通常用于输出日志信息,带缓冲。
- int age;
- std::cin >> age; // 从键盘读取一个整数
- std::cout << "Hello, World!" << std::endl; // 向屏幕输出 "Hello, World!"
- std::cerr << "Error: Invalid input" << std::endl; // 输出错误信息
- std::clog << "Log: Application started" << std::endl; // 输出日志信息
复制代码 std::cin、std::cout、std::cerr 和 std::clog 的本质:
这四个尺度流对象本质上是全局对象。它们是 C++ 尺度库中定义的对象,专门用于处理尺度输入、尺度输出和错误输出的流操作。根据尺度库的定义,这些流对象大抵是以如下方式声明的(虽然实际的实现可能会有所差别):
- namespace std {
- extern istream cin; // 标准输入
- extern ostream cout; // 标准输出
- extern ostream cerr; // 标准错误输出(无缓冲)
- extern ostream clog; // 标准日志输出(带缓冲)
- }
复制代码 2.2、格式化输出
通过 iostream,可以对输出举行格式化。以下是几种常用的格式化方法:
- std::endl:输出换行并革新输出缓冲区。
- std::setw():设置字段宽度,定义在 iomanip 头文件中。
- std::setprecision():设置浮点数的精度,定义在 iomanip 头文件中。
- std::fixed 和 std::scientific:设置浮点数的显示格式。
- std::cout << "Hello, World!" << std::endl;
- std::cout << std::setw(10) << 123; // 输出的数字宽度为10个字符
- double pi = 3.14159;
- std::cout << std::setprecision(3) << pi; // 输出为 3.14
- double num = 1234.56789;
- std::cout << std::fixed << num; // 以固定小数点格式输出
- std::cout << std::scientific << num; // 以科学计数法格式输出
复制代码 std::endl 的本质:
本质上是一个函数,而不是一个简单的换行符。它的功能不但仅是插入换行符(\n),它还会革新输出缓冲区,确保缓冲区中的数据被立即输出到设备(如终端、文件等)。std::endl 是定义在 ostream 类中的模板函数,它的声明通常如下:
- namespace std
- {
- template <class charT, class traits>
- basic_ostream<charT, traits>& endl(basic_ostream<charT, traits>& os)
- {
- os.put(os.widen('\n')); // 插入换行符
- os.flush(); // 刷新缓冲区
- return os;
- }
- }
复制代码 2.3、状态标志
在利用 iostream 举行输入输出时,流可能会出现一些错误情况,比如输入格式不正确、文件结束等。C++ 提供了一些函数和状态标志来查抄流的状态:
eof():查抄是否到达文件末尾。
- if (std::cin.eof())
- {
- std::cout << "End of file reached" << std::endl;
- }
复制代码 fail():查抄上一次输入操作是否失败。
- if (std::cin.fail())
- {
- std::cerr << "Input failed!" << std::endl;
- }
复制代码 bad():查抄是否发生严峻的输入输堕落误。
- if (std::cin.bad())
- {
- std::cerr << "A critical error occurred!" << std::endl;
- }
复制代码 clear():重置流的状态标志。
- std::cin.clear(); // 清除所有错误标志
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |