本文是玩转C++11的输入输出的单独文章,更多内容可以点击链接跳转

C/C++的输入输出

在正常情况下(在同步情况下),如果C和C++混用,由于C和C++使用的使用的是同一块缓冲区,在输入输出流中会优先执行C的输入输出操作,再执行C++的输入输出操作
但是在取消同步之后,C和C++之间的缓冲区完全独立,因此C和C++输入输出的顺序也是完全独立的了。

(1) scanf和printf

优点:格式化输入、输出

input 15:20 
	scanf("%d:%d,&a,&b");

output 1.00002
	printf("%.5lf",x)

注意事项:不能开取消同步流!!!

(2) cin和cout

优点:简洁,在取消同步流的情况下,一般会比scanf更快

[1] cin

cin是个istream类型的输入对象,一般来说我们是这么使用它的:

int temp;
std::cin>>temp;

这个能够读取基本数据类型,并且将空白字符(空格、换行符、制表符)作为分隔符,将输入解析为指定的数据类型,并将解析后的值存储到相应的变量中。即:cin只读取连续非空格字符
我们还有一种用法:

char temp;
std::cin.get(temp);

这种方法用于读取单个(任意)字符,这意味着它可以读取空白字符

[2] cout

cout是个ostream类型的输出对象,也很常见:

std::cout<<"Hello World";

**它往往会和endl搭配使用,起到换行的作用,但是往往不建议这么做,理由在:(4) 在算法中尽量少使用endl

(3) 取消同步流

ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//取消同步流

指:通过取消同步流,你可以独立地操作C++标准输入输出流和C标准输入输出库,它们不再共享同一个缓冲区,各自拥有独立的缓冲区

  1. 提高即时性:取消同步流后,你可以立即在C++输入输出流上进行操作,并且不需要等待缓冲区满或遇到换行符等条件。这可以提高程序的响应性,避免一些不必要的延迟。
  2. 灵活性:取消同步流后,你可以使用C++特有的输入输出操作,如std::cin和std::cout,而无需再使用C标准输入输出库的函数(如scanf和printf)。这样可以使代码更符合C++的风格和习惯。

但是需要注意的是:在取消了同步流之后,C++和输入输出和C的输入输出就不能混用了,混用的话会导致某些未定义的错误
接下来,我们对这串代码进行一个解释说明。

[1] ios是什么?

ios是个基类,是istream和ostream的直接基类,它提供了一些通用的成员函数和状态函数,用于处理流的基本操作、状态和格式控制。这些成员函数包括用于打开、关闭、读写、格式化和查询流等操作。
由于ios本身是一个抽象基类,不能直接创建对象或流实例。相反,我们通常会使用其派生类iostream、ifstream、ofstream或者stringstream来创建具体的输入输出流对象

[2] sync_with_stdio()又是什么?

ios类提供了一个成员函数sync_with_stdio(),用于设置C的标准输入输出库与C++输入输出流之间的同步状态
默认情况下,C++输出流和C的标准输入输出库是同步的。这意味着它们共享同一个缓冲区。这样做的好处是可以提高性能,避免频繁的系统调用。不过,这也可能导致一些不便,例如在使用C++输入输出流时,需要手动刷新缓冲区才能实时地输出到终端。
sync_with_stdio()可以用于在C++输入输出流和C的标准输入输出库之间才能进行同步设置的开关。该函数有个bool参数,ture表示同步,false表示异步,即不进行同步

[3] 刷新缓存区

缓冲区被填满、遇到换行符(endl)、或者使用std::fflush进行手动刷新时,数据会被发送到目标设备进行显示。

[4] tie()有什么用?

在默认情况下,cin和cout是绑定在一起的,即:当cout的缓冲区刷新的时候,cin的缓冲区由于绑定的存在也同时进行了刷新。可以使用如cin.tie()函数将cin与其他流(例如cout)进行解绑。
这对于一些需要及时用户输入的情况非常有用,例如在游戏中等待用户的按键输入。

(4) 在算法中尽量少使用endl

endl=‘\n’+强制刷新缓冲区
其中刷新缓冲区这个操作非常需要时间,因此尽量少用甚至不用,建议使用”\n"

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐