本文是玩转C++11的输入输出的单独文章,更多内容可以点击链接跳转
在正常情况下(在同步情况下),如果C和C++混用,由于C和C++使用的使用的是同一块缓冲区,在输入输出流中会优先执行C的输入输出操作,再执行C++的输入输出操作。
但是在取消同步之后,C和C++之间的缓冲区完全独立,因此C和C++输入输出的顺序也是完全独立的了。
优点:格式化输入、输出
input 15:20
scanf("%d:%d,&a,&b");
output 1.00002
printf("%.5lf",x)
注意事项:不能开取消同步流!!!
优点:简洁,在取消同步流的情况下,一般会比scanf更快
cin是个istream类型的输入对象,一般来说我们是这么使用它的:
int temp;
std::cin>>temp;
这个能够读取基本数据类型,并且将空白字符(空格、换行符、制表符)作为分隔符,将输入解析为指定的数据类型,并将解析后的值存储到相应的变量中。即:cin只读取连续非空格字符
我们还有一种用法:
char temp;
std::cin.get(temp);
这种方法用于读取单个(任意)字符,这意味着它可以读取空白字符!
cout是个ostream类型的输出对象,也很常见:
std::cout<<"Hello World";
**它往往会和endl搭配使用,起到换行的作用,但是往往不建议这么做,理由在:(4) 在算法中尽量少使用endl。
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
//取消同步流
指:通过取消同步流,你可以独立地操作C++标准输入输出流和C标准输入输出库,它们不再共享同一个缓冲区,各自拥有独立的缓冲区
但是需要注意的是:在取消了同步流之后,C++和输入输出和C的输入输出就不能混用了,混用的话会导致某些未定义的错误
接下来,我们对这串代码进行一个解释说明。
ios是个基类,是istream和ostream的直接基类,它提供了一些通用的成员函数和状态函数,用于处理流的基本操作、状态和格式控制。这些成员函数包括用于打开、关闭、读写、格式化和查询流等操作。
由于ios本身是一个抽象基类,不能直接创建对象或流实例。相反,我们通常会使用其派生类iostream、ifstream、ofstream或者stringstream来创建具体的输入输出流对象
ios类提供了一个成员函数sync_with_stdio(),用于设置C的标准输入输出库与C++输入输出流之间的同步状态。
默认情况下,C++输出流和C的标准输入输出库是同步的。这意味着它们共享同一个缓冲区。这样做的好处是可以提高性能,避免频繁的系统调用。不过,这也可能导致一些不便,例如在使用C++输入输出流时,需要手动刷新缓冲区才能实时地输出到终端。
sync_with_stdio()可以用于在C++输入输出流和C的标准输入输出库之间才能进行同步设置的开关。该函数有个bool参数,ture表示同步,false表示异步,即不进行同步
当缓冲区被填满、遇到换行符(endl)、或者使用std::fflush进行手动刷新时,数据会被发送到目标设备进行显示。
在默认情况下,cin和cout是绑定在一起的,即:当cout的缓冲区刷新的时候,cin的缓冲区由于绑定的存在也同时进行了刷新。可以使用如cin.tie()函数将cin与其他流(例如cout)进行解绑。
这对于一些需要及时用户输入的情况非常有用,例如在游戏中等待用户的按键输入。
endl=‘\n’+强制刷新缓冲区
其中刷新缓冲区这个操作非常需要时间,因此尽量少用甚至不用,建议使用”\n"。