深入理解 C++ 中的 IO 流【iostream篇】

2024-03-26 23:20
文章标签 c++ 深入 理解 io iostream

本文主要是介绍深入理解 C++ 中的 IO 流【iostream篇】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

C++ 中的输入输出流(iostream)是非常重要的一部分,它们提供了与用户交互以及与文件系统进行数据交换的功能。本文将深入探讨 C++ 中的 cin 和 cout,介绍它们的使用方法、缓冲区以及常用的成员函数等相关知识。

1. cin 和 cout 的基本使用

在 C++ 中,cin 和 cout 是标准输入输出流对象,分别用于从标准输入(通常是键盘)读取数据和向标准输出(通常是屏幕)写入数据。

#include <iostream>int main() {int num;std::cin >> num;std::cout << num << std::endl;return 0;
}

在上面的示例中,我们使用 cout 来打印提示消息,并使用 cin 读取用户输入的数字。

2. 运算符重载与 iostream

在 iostream 中,常见的运算符重载包括插入运算符 << 和提取运算符 >>。这两个运算符分别用于输出数据到流和从流中提取数据。

重载插入运算符 <<

插入运算符 << 用于将数据插入到输出流中,通常用于输出数据到控制台或文件。

#include <iostream>class MyClass {
public:int data;MyClass(int d) : data(d) {}friend std::ostream& operator<<(std::ostream& os, const MyClass& obj) {os << obj.data;return os;}
};int main() {MyClass obj(10);std::cout  << obj << std::endl;return 0;
}

在上面的示例中,我们重载了 << 运算符,使得 MyClass 类型的对象可以直接通过 cout 输出。

重载提取运算符 >>

提取运算符 >> 用于从输入流中提取数据,通常用于从控制台或文件中读取数据。

#include <iostream>class MyClass {
public:int data;MyClass() {}friend std::istream& operator>>(std::istream& is, MyClass& obj) {is >> obj.data;return is;}
};int main() {MyClass obj;std::cin >> obj;std::cout << obj.data << std::endl;return 0;
}

在上面的示例中,我们重载了 >> 运算符,使得可以直接从 cin 输入到 MyClass 类型的对象。并且由于fstream和sstream继承了iostream,因此重载了iostream后fstream和sstream也可以使用,后面的博客会将。

3. cin 和 cout 的缓冲区

在默认情况下,cin 和 cout 都是带有缓冲区的。这意味着输入的数据不会立即被程序处理,而是暂时存储在缓冲区中,直到程序需要时才进行读取或写入操作。

缓冲区刷新

缓冲区的刷新通常由以下情况触发:

  • 缓冲区已满:当缓冲区填满数据时,会自动刷新缓冲区,将数据发送给目标设备(如屏幕)。
  • 手动刷新:可以使用 std::flush 强制刷新输出缓冲区。
std::cout << "Flushing buffer" << std::flush;

关闭缓冲区

有时候,我们可能需要关闭缓冲区以实时地输出数据,而不需要等到缓冲区满或程序结束时才输出。可以使用 std::ios::sync_with_stdio(false) 来关闭 cin 和 cout 的缓冲区。

#include <iostream>int main() {std::ios::sync_with_stdio(false); // 关闭缓冲区std::cout << "This will be printed immediately" << std::endl;return 0;
}

4. cin 和 cout 的常用成员函数

cin 和 cout 提供了许多有用的成员函数,可以帮助我们更灵活地处理输入输出操作。

cin 成员函数

  • cin.get(): 从输入流中获取下一个字符。
  • cin.getline(char*, int): 从输入流中获取一行数据。可指定分割符,默认为'\n'。
  • cin.read(char*, int):从输入流中读取一定数量的字符

cout 成员函数

  • cout.put(char): 向输出流中写入一个字符。
  • cout.write(char*, int): 向输出流中写入一定数量的字符。

具体使用和例子可以查看手册。

这篇关于深入理解 C++ 中的 IO 流【iostream篇】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/850200

相关文章

C++ 右值引用(rvalue references)与移动语义(move semantics)深度解析

《C++右值引用(rvaluereferences)与移动语义(movesemantics)深度解析》文章主要介绍了C++右值引用和移动语义的设计动机、基本概念、实现方式以及在实际编程中的应用,... 目录一、右值引用(rvalue references)与移动语义(move semantics)设计动机1

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

C++构造函数中explicit详解

《C++构造函数中explicit详解》explicit关键字用于修饰单参数构造函数或可以看作单参数的构造函数,阻止编译器进行隐式类型转换或拷贝初始化,本文就来介绍explicit的使用,感兴趣的可以... 目录1. 什么是explicit2. 隐式转换的问题3.explicit的使用示例基本用法多参数构造

C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解

《C++,C#,Rust,Go,Java,Python,JavaScript的性能对比全面讲解》:本文主要介绍C++,C#,Rust,Go,Java,Python,JavaScript性能对比全面... 目录编程语言性能对比、核心优势与最佳使用场景性能对比表格C++C#RustGoJavapythonjav

C++打印 vector的几种方法小结

《C++打印vector的几种方法小结》本文介绍了C++中遍历vector的几种方法,包括使用迭代器、auto关键字、typedef、计数器以及C++11引入的范围基础循环,具有一定的参考价值,感兴... 目录1. 使用迭代器2. 使用 auto (C++11) / typedef / type alias

C++ scoped_ptr 和 unique_ptr对比分析

《C++scoped_ptr和unique_ptr对比分析》本文介绍了C++中的`scoped_ptr`和`unique_ptr`,详细比较了它们的特性、使用场景以及现代C++推荐的使用`uni... 目录1. scoped_ptr基本特性主要特点2. unique_ptr基本用法3. 主要区别对比4. u

C++11中的包装器实战案例

《C++11中的包装器实战案例》本文给大家介绍C++11中的包装器实战案例,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录引言1.std::function1.1.什么是std::function1.2.核心用法1.2.1.包装普通函数1.2.

C++多线程开发环境配置方法

《C++多线程开发环境配置方法》文章详细介绍了如何在Windows上安装MinGW-w64和VSCode,并配置环境变量和编译任务,使用VSCode创建一个C++多线程测试项目,并通过配置tasks.... 目录下载安装 MinGW-w64下载安装VS code创建测试项目配置编译任务创建 tasks.js

C++ 多态性实战之何时使用 virtual 和 override的问题解析

《C++多态性实战之何时使用virtual和override的问题解析》在面向对象编程中,多态是一个核心概念,很多开发者在遇到override编译错误时,不清楚是否需要将基类函数声明为virt... 目录C++ 多态性实战:何时使用 virtual 和 override?引言问题场景判断是否需要多态的三个关