C++ 尺度库 —— iostream

王柳  金牌会员 | 2024-10-8 10:45:56 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 768|帖子 768|积分 2304

1、istream 和 ostream 

1.1、istream类

istream 类用于从尺度输入设备(比方键盘)或其他输入设备(如文件)读取数据,它是所有输入流类的基类。
常用的成员函数
operator>>:提取运算符,用于从输入流中提取数据。
   >> 的实现原理
  在 ostream 类中,<< 操作符被重载为一个函数,该函数可以或许处理各种类型的输出,比如整型、浮点型、字符串等。每次利用 << 时,数据都会传递给该运算符函数,终极输出到流所指向的设备上(如终端或文件)。典型的输出运算符重载形式为:
  1. std::ostream& operator<<(std::ostream& os, int value);
  2. std::ostream& operator<<(std::ostream& os, double value);
  3. std::ostream& operator<<(std::ostream& os, const char* str);
复制代码
链式调用的原理
  << 操作符的返回值是对输出流对象本身的引用(std:stream&),这使得链式调用成为可能。如下面例子,std::cout << "x = " 返回的是 std:stream&,接着 x 通过下一个 << 操作符继续输出。
  1. std::cout << "x = " << x << ", y = " << y;
复制代码
get():从输入流中获取一个字符或字符数组。
  1. char ch;
  2. std::cin.get(ch);  // 读取一个字符
复制代码
getline():从输入流中读取一行字符串。
  1. std::string line;
  2. std::getline(std::cin, line);  // 读取一行字符串
复制代码
1.2、ostream 类

ostream 类用于将数据输出到尺度输出设备(比方屏幕)或其他输出设备,它是所有输出流类的基类。
常用的成员函数
operator<<:插入运算符,用于将数据输出到流中(实现原理与 >> 类似)。
put():输出一个字符。
  1. std::cout.put('A');  // 输出字符 'A'
复制代码
write():输出一系列字符。
  1. char str[] = "C++ Programming";
  2. 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:尺度日志输出流,通常用于输出日志信息,带缓冲。
  1. int age;
  2. std::cin >> age;  // 从键盘读取一个整数
  3. std::cout << "Hello, World!" << std::endl;  // 向屏幕输出 "Hello, World!"
  4. std::cerr << "Error: Invalid input" << std::endl;  // 输出错误信息
  5. std::clog << "Log: Application started" << std::endl;  // 输出日志信息
复制代码
  std::cin、std::cout、std::cerr 和 std::clog 的本质:
  这四个尺度流对象本质上是全局对象。它们是 C++ 尺度库中定义的对象,专门用于处理尺度输入、尺度输出和错误输出的流操作。根据尺度库的定义,这些流对象大抵是以如下方式声明的(虽然实际的实现可能会有所差别):
  1. namespace std {
  2.     extern istream cin;   // 标准输入
  3.     extern ostream cout;  // 标准输出
  4.     extern ostream cerr;  // 标准错误输出(无缓冲)
  5.     extern ostream clog;  // 标准日志输出(带缓冲)
  6. }
复制代码
2.2、格式化输出

通过 iostream,可以对输出举行格式化。以下是几种常用的格式化方法:


  • std::endl:输出换行并革新输出缓冲区。
  • std::setw():设置字段宽度,定义在 iomanip 头文件中。
  • std::setprecision():设置浮点数的精度,定义在 iomanip 头文件中。
  • std::fixed 和 std::scientific:设置浮点数的显示格式。
  1. std::cout << "Hello, World!" << std::endl;
  2. std::cout << std::setw(10) << 123;  // 输出的数字宽度为10个字符
  3. double pi = 3.14159;
  4. std::cout << std::setprecision(3) << pi;  // 输出为 3.14
  5. double num = 1234.56789;
  6. std::cout << std::fixed << num;       // 以固定小数点格式输出
  7. std::cout << std::scientific << num;  // 以科学计数法格式输出
复制代码
  std::endl 的本质
  本质上是一个函数,而不是一个简单的换行符。它的功能不但仅是插入换行符(\n),它还会革新输出缓冲区,确保缓冲区中的数据被立即输出到设备(如终端、文件等)。std::endl 是定义在 ostream 类中的模板函数,它的声明通常如下:
  1. namespace std
  2. {
  3.     template <class charT, class traits>
  4.     basic_ostream<charT, traits>& endl(basic_ostream<charT, traits>& os)
  5.     {
  6.         os.put(os.widen('\n'));   // 插入换行符
  7.         os.flush();               // 刷新缓冲区
  8.         return os;
  9.     }
  10. }
复制代码
2.3、状态标志

在利用 iostream 举行输入输出时,流可能会出现一些错误情况,比如输入格式不正确、文件结束等。C++ 提供了一些函数和状态标志来查抄流的状态:
eof():查抄是否到达文件末尾。
  1. if (std::cin.eof())
  2. {
  3.     std::cout << "End of file reached" << std::endl;
  4. }
复制代码
fail():查抄上一次输入操作是否失败。
  1. if (std::cin.fail())
  2. {
  3.     std::cerr << "Input failed!" << std::endl;
  4. }
复制代码
bad():查抄是否发生严峻的输入输堕落误。
  1. if (std::cin.bad())
  2. {
  3.     std::cerr << "A critical error occurred!" << std::endl;
  4. }
复制代码
clear():重置流的状态标志。
  1. std::cin.clear();  // 清除所有错误标志
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

王柳

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表