Cracking C++(10): 基本的输入输出流

news2024/11/24 14:14:41

文章目录

    • 1. 目的
    • 2. I/O Streams 输入/输出流
    • 3. Stream Operators 流操作符
    • 4. 禁止使用 `std::endl`
    • 5. 缓冲区:直观理解
    • 6. References

1. 目的

查看 hackingcpp 上的 Input & Output (Basics) 教程后的笔记和拓展内容。

2. I/O Streams 输入/输出流

在这里插入图片描述

使用 C++ 的标准输入和输出的例子代码如下:

#include <iostream>

int main () {
  int i;
  // read value into i
  std::cin  >> i;
  // print value of i
  std::cout << i << '\n';
}

解释:

  • std::cin 是一个变量, 而不是函数。 std::cout, std::cerr, std::clog 也是对象
  • std::cin 意思是 “characters from stdin”, 其中 stdin 是 standard input 标准输入的缩写, std::cin 是从标准输入的缓冲(buffer)读取内容。 标准输入可以有很多种,最常见的是键盘。
  • std::cout 意思是 “characters to stdout”, 其中 stdout 是 standard output 标准输出的缩写, std::cout 是把内容写到缓冲区(buffer), 如果缓冲区满了则输出到控制台。重定向到文件的话, 对应到的 fd 为 1。
  • std::clog 意思是 “characters to stderr”, 其中 stderr 是 standard error 标准错误输出的缩写, std::cerr 是把内容写到缓冲区(buffer),如果缓冲区满了则输出到控制台; 这看起来和 std::cout 差不多, 区别在于如果重定向到文件, std::clog 对应到的 fd 为 2。
  • std::cerr 意思是 “characters to stderr”, 是说把内容立即写入到控制台, 而不经过“缓冲区”(buffer)。这是和 std::log 的差别。 std::cerr 内容重定向到文件的话, fd 也是 2.

3. Stream Operators 流操作符

在这里插入图片描述

>> 意思是 “get from”, 获取内容。 语法是 source >> target.

<< 意思是 “put to”, 写入内容。 语法是 target << source.

  • 流对象的 >><< 两个操作符,适用于基础类型 以及 string 类型
  • >> 持续读取, 直到遇到下一个空白字符(空格,tab,换行,。。。)
  • 可以是链式操作, 也就是说 std::cin >> xx 是有返回值的, 返回值仍然是 std::cin 对象。 其他三个对象也是返回自身:
int i = 0;
double d = 0.0;
// read 2 values of different type:
std::cin >> i >> d; 
// print 2 values and some text:
std::cout << "your input:\n"  
          << i << " and " << d << '\n';

4. 禁止使用 std::endl

在这里插入图片描述

作者禁止学员们使用 std::endl 原因是每次调用 std::endl 都会刷新(flush)缓冲区, 也就是立即输出到控制台, 而频繁写到控制台基本上等于说没有缓冲区, 使得性能变慢。

std::cout << "some text" << std::endl; // bad
std::cout << "more text" << std::endl; // bad
std::cout << "some text\n" << std::endl; // ok
std::cout << "more text\n" << std::endl; // ok

5. 缓冲区:直观理解

fprintf(stderr, ...) 会直接输出到屏幕, 不会考虑缓冲区。

于是, 在 fprintf(stderr, ..) 的前面、后面分别用 print/cout 输出, 并且不含有 std::endl, 会发现有趣的现象: 内容分布在两行:

int test2()
{
    for (int i = 0; i < 10; i++)
    {
        std::cout << "1 ";
        printf("2 ");
    }

    fprintf(stderr, "This is stderr output\n");

    for (int i = 0; i < 10; i++)
    {
        std::cout << "1 ";
        printf("2 ");
    }

    return 0;
}

输出为:

This is stderr output
1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2 % 

也就是说, fprintf(stderr, ...) 立即写入到屏幕, 不会破坏原有的 printf / std::cout 的写入缓冲区的操作, 而缓冲区虽然大小我们不知道, 但是肯定是容纳了所有的 "1 " 和 "2 " 的输出内容, 连在了一块儿。

6. References

  • C/C++ 输入输出缓冲区在Windows和Linux下对比
  • https://hackingcpp.com/cpp/std/io_basics.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635750.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:合并多个文件——Python的终极解决方案

合并多个文件——Python的终极解决方案 Python是一种高级编程语言&#xff0c;其简单明了的语法和丰富的库使其成为开发者的首选语言之一。在日常编码中&#xff0c;我们有时候需要将多个文件合并成一个文件以便于处理。这篇文章将详细介绍Python如何进行多个文件的合并。 什…

高数下——查漏补缺

期末复习 一、向量与空间几何 二、多元函数与重极限 2.1定义域 2.2 二元函数重极限

【实战】体验SadTalker

论文http://openaccess.thecvf.com//content/CVPR2023/papers/Zhang_SadTalker_Learning_Realistic_3D_Motion_Coefficients_for_Stylized_Audio-Driven_Single_CVPR_2023_paper.pdf github GitHub - OpenTalker/SadTalker: [CVPR 2023] SadTalker&#xff1a;Learning Realist…

chatgpt赋能python:Python如何合并单元格-实用技巧教程

Python如何合并单元格 - 实用技巧教程 单元格合并是Excel文件和Word文档等办公软件中很常见的功能&#xff0c;而使用Python对数据进行处理时&#xff0c;也可能需要实现合并单元格的操作。本文将为大家介绍Python中实现合并单元格的方法&#xff0c;并给出代码示例。 什么是…

HTML段落标签

HTML段落标签 段落标签 显示特点&#xff1a; 代码&#xff1a; 显示效果&#xff1a; 总结&#xff1a; 答案&#xff1a;

Java性能权威指南-总结10

Java性能权威指南-总结10 垃圾收集算法理解G1垃圾收集器 垃圾收集算法 理解G1垃圾收集器 G1垃圾收集器是一种工作在堆内不同分区上的并发收集器。分区(region)既可以归属于老年代&#xff0c;也可以归属于新生代(默认情况下&#xff0c;一个堆被划分成2048个分区),同一个代的…

chatgpt赋能python:如何取消Python中的科学计数法

如何取消Python中的科学计数法 Python是一种面向对象、解释型的高级编程语言。由于它在数值计算、科学计算以及数据分析等领域的强大功能&#xff0c;Python语言已经成为科学计算和机器学习领域中最常用的语言之一。 然而&#xff0c;当我们进行大量运算时&#xff0c;Python…

[SpringBoot]Spring Security框架

目录 关于Spring Security框架 Spring Security框架的依赖项 Spring Security框架的典型特征 关于Spring Security的配置 关于默认的登录页 关于请求的授权访问&#xff08;访问控制&#xff09; 使用自定义的账号登录 使用数据库中的账号登录 关于密码编码器 使用BCry…

chatgpt赋能python:Python和Java:如何结合使用以提高开发效率

Python和Java&#xff1a;如何结合使用以提高开发效率 Python和Java是两种非常流行的编程语言&#xff0c;它们各自有自己的优势和用途。但有时候&#xff0c;我们需要将它们结合起来使用&#xff0c;以便更好地完成某些任务。在本文中&#xff0c;我们将介绍如何通过使用Java…

2.17 内存映射(1) 2.18内存映射(2)

2.17 内存映射&#xff08;1&#xff09; 内存映射 内存映射相关系统调用 void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);- 功能&#xff1a;将一个文件或者设备的数据映射到内存中- 参数&#xff1a;- void *addr: NULL, 由内核指定- le…

SpringSecurity学习 -- 1 springSecurity

目录 简介&#xff1a; token和jwt的区别 1.快速入门 1.自定义用户名和密码。 自定义重定向。 2.设置权限管理 3.从路径中获取用户信息 2.SpringSecurity核心组件 SecurityContext : authentication对象的容器。 SecurityContextHolder : Authentication: ​编辑 U…

Scala概述及变量和常量的重点

1.什么是scala Scala是一种多范式的编程语言&#xff08;多范式&#xff1a;多种编程方法的意思。有面向过程、面向对象、泛型、函数式四种程序设计方法&#xff09;&#xff0c;其设计的初衷是要集成面向对象编程和函数式编程的各种特性。Scala运行于Java平台&#xff08;Jav…

python语法-面向对象数据分析案例(每日销售额柱状图数据可视化)

面向对象数据分析案例&#xff08;每日销售额柱状图数据可视化&#xff09; 使用工具&#xff1a; Pycharm、面向对象、json模块、pyecharts模块等 实现步骤&#xff1a; 读取数据–封装数据对象–计算数据对象–pyechars绘图 &#xff08;项目数据见文章末参考内容&#xff09…

UDS关于0x36数据传输学习笔记

1.服务说明 客户端使用TransferData服务将数据从客户端传输到服务器&#xff08;下载&#xff09;或从服务器传输到客户端&#xff08;上传&#xff09;。 数据传输方向由前面的RequestDownload或RequestUpload服务定义。如果客户端发起了RequestDownload&#xff0c;则要下载的…

HTML注释

注释 注释的写法&#xff1a; 注释快捷键&#xff1a; 代码&#xff1a; 效果&#xff1a; 总结 答案&#xff1a;

usb 的拓扑结构

usb 驱动开发 usb 的基本概念 这个忽略&#xff0c; 基本上usb 是啥都知道 usb 的拓扑结构 usb 是一种主从结构的系统 usb主机由usb主控之器&#xff08;Host Controller)和根集线器&#xff08;Root Hub&#xff09; 构成 usb 主控制器&#xff1a; 主要负责数据处理(就…

chatgpt赋能python:Python数据合并入门指南

Python数据合并入门指南 数据合并是数据分析和处理中的一个重要步骤。使用Python可以轻松地将多个数据集合并成一个&#xff0c;以实现更综合和完整的数据分析。在本篇关于Python数据合并的入门指南中&#xff0c;我们将介绍两个主要的数据合并方法&#xff1a;concat和merge。…

PolarDB MySQL 联邦查询优化特征(条件下推、按需返回列、LIMIT OFFSET下推)

背景 社区版 MySQL 支持的联邦引擎可以将位于远程数据库实例的表像本地表一样访问&#xff0c;大大方便了用户管理多个数据库实例的数据做聚合查询和分析。但是在性能方面存在着可以优化的地方&#xff1a; 只有在可以使用索引 RANGE/REF 方式扫描时&#xff0c;可以将索引上…

2.21 alarm函数 2.22setitimer定时器函数

2.21 alarm函数 #include <unistd.h> unsigned int alarm(unsigned int seconds);功能&#xff1a;设置定时器&#xff08;闹钟&#xff09;。函数调用&#xff0c;开始倒计时&#xff0c;当倒计时为0的时候&#xff0c; 函数会给当前的进程发送一个信号&#xff1a;SIG…

chatgpt赋能python:Python如何另起一行输出

Python如何另起一行输出 如果你正在学习Python编程&#xff0c;你肯定已经遇到过这个问题&#xff1a;如何另起一行输出&#xff1f; Python是一门非常强大的编程语言&#xff0c;它可以完成各种各样的任务&#xff0c;包括从简单的文本处理到复杂的数据分析和机器学习。但是…