C / C++ 输入输出缓存处理
2016-05-17 10:21
162 查看
方法有两种:
1,设置输出缓存大小为0。
2,输出前刷新输出stdout
如何正确清空cin缓存
关于cin缓存的清空,网上有各种说法。最多的是使用
cin.sync();
但是,关于这个sync方法在不同的编译器中有不同的实现。VC中确实可以清空cin的缓存,但是在GNU中,不行。因此使用sync方法是没有通用性的。
又有说法是使用
cin.seekg(0, ios_base::end);
但是依旧无法正常工作。以下是一个测试代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
测试结果为:
还有一种方法是使用
fflush(stdin);
这种方法一般是可以成功的。但是,如果肯定只使用cin和cout,而不使用stdio的内容的话,可以加入以下语句增加输入输出的速度:
cin.sync_with_stdio(false);
这种情况下,fflush无法正常工作了。
最后,说一个肯定可以解决问题的方案,使用ignore方法,第一个参数表示忽略多少个字符,可以传入第二个参数,表示直到碰到什么字符为止。可以使用以下方案:
cin.ignore(INT_MAX, ‘\n’);
最终的解决方案示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
效果如下:
1,设置输出缓存大小为0。
setvbuf(stdout, NULL, _IONBF, 0);
2,输出前刷新输出stdout
fflush(stdout);
如何正确清空cin缓存
关于cin缓存的清空,网上有各种说法。最多的是使用
cin.sync();
但是,关于这个sync方法在不同的编译器中有不同的实现。VC中确实可以清空cin的缓存,但是在GNU中,不行。因此使用sync方法是没有通用性的。
又有说法是使用
cin.seekg(0, ios_base::end);
但是依旧无法正常工作。以下是一个测试代码:
#include <iostream> using namespace std; int main() { int a, b; cin >> a; cin.seekg(1, ios_base::end); cin >> b; cout << a << ',' << b << endl; return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
测试结果为:
还有一种方法是使用
fflush(stdin);
这种方法一般是可以成功的。但是,如果肯定只使用cin和cout,而不使用stdio的内容的话,可以加入以下语句增加输入输出的速度:
cin.sync_with_stdio(false);
这种情况下,fflush无法正常工作了。
最后,说一个肯定可以解决问题的方案,使用ignore方法,第一个参数表示忽略多少个字符,可以传入第二个参数,表示直到碰到什么字符为止。可以使用以下方案:
cin.ignore(INT_MAX, ‘\n’);
最终的解决方案示例代码如下:
#include <iostream> using namespace std; int main() { int a, b; cin.sync_with_stdio(false); cin >> a; cin.ignore(INT_MAX, '\n'); cin >> b; cout << a << ',' << b << endl; return 0; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
效果如下:
相关文章推荐
- C语言指针变量可以当做数组运用
- 2016年,C语言该怎样写
- gsoap笔记 C++
- 330. Patching Array (C++实现)
- 深入理解C++中public、protected及private用法
- OC语言笔记(十二):OC字符串、数组、字典常用方法大全
- OC语言笔记(十一):OC沙盒查找步骤
- C#调用C++DLL的小总结5---和C++的DLL的联合调试
- 第8周 C语言及程序设计提高例程-30 字符和字符串处理函数
- 成为C++高手之for循环
- 预定义宏 ANSI C
- C++虚基类的实现机制:笔记
- 原型模式-c++实现
- Effective C++: volatile
- C++对python模块进行扩展
- JAVA内部类实现多重继承父类[实现类似C++的多重继承功能]
- 在VS2013中使用boost库遇到的问题及解决
- 挖一下那些年的东东(模拟内存申请与释放C语言)
- C++中 关于结构体中有char *类型的指针 赋值问题
- POJ 8780 拦截导弹