clear()、sync()、ignore()

#include <iostream>
using namespace std;
int main()
{
    int a;
    cin>>a;
    cout<<cin.rdstate()<<endl;
    if(cin.rdstate() == ios::goodbit)
    {
        cout<<"输入数据的类型正确,无错误!"<<endl;
    }
    if(cin.rdstate() == ios_base::failbit)
    {
        cout<<"输入数据类型错误,非致命错误,可清除输入缓冲区挽回!"<<endl;
    }
    system("pause");
}  

我们定义要输入到的变量是整型,但如果我们输入了英文字母或者汉字,那就会发生错误,cin里有个方法能检测这个错误,就是cin.rdstate(); 当cin.rdstate()返回0(即ios::goodbit)时表示无错误,可以继续输入或者操作,若返回4则发生非致命错误即ios::failbit,则不能继续输入或操作.而cin.clear则可以控制我们此时cin里对这个问题的一个标识.语发如下: cin.clear(标识符); 标识符号为:

goodbit 无错误 
Eofbit 已到达文件尾 
failbit 非致命的输入/输出错误,可挽回 
badbit 致命的输入/输出错误,无法挽回 若在输入输出类里.需要加ios::标识符号 
通过cin.clear,我们能确认它的内部标识符,如果输入错误则能重新输入.结合真正的清空数据流方法cin.sync(),请看下例:

#include <iostream>
using namespace std;
int main()
{
    int a;
    while(1)
    {
        cin>>a;
        if(!cin)            //条件可改写为cin.fail()
        {
            cout<<"输入有错!请重新输入"<<endl;
            cin.clear();
            cin.sync();   //同步数据缓冲区?
        }
        else
        {
            cout<<a;
            break;
        }
    }
    system("pause");
}  

上面的cin.clear()默认参数为0,即无错误,正常操作.当我们输入英文字母‘k‘时,它的状态标识改为fail,即错误,用cout对用户输出信息,再用cin.clear让错误标识改回为0,让我们可以继续输入,再清空流数据继续输入.如果我们没有了cin.clear,则会进入死循环,其过程为我们输入了英文字母,它的状态标识便为fail,当运行到条件判断时,便总是回到错误的条件表示里,并且我们再也没办法输入,因为错误的表示关闭了cin,所以会进入死循环.

参考原文:http://www.cnblogs.com/tonglingliangyong/p/3908463.html

关于sync()函数的作用应该是同步缓冲区的数据,而并非清除缓冲区的数据(下面补充)。清除缓冲区数据用下面这种方式。

cin.ignore(numeric_limits<std::streamsize>::max(),‘/n‘);//清除当前行
cin.ignore(numeric_limits<std::streamsize>::max());     //清除cin里所有内容

numeric_limits<std::streamsize>::max()是climits头文件定义的流使用的最大值,你也可以用一个足够大的整数代替它。

关于sync()的例子:

#include <iostream>
#include <fstream>

void file_abc()
{
    std::ofstream f("test.txt");
    f << "abc\n";
}

void file_123()
{
    std::ofstream f("test.txt");
    f << "123\n";
}

int main()
{
    file_abc(); // file now contains "abc"
    std::ifstream f("test.txt");
    std::cout << "Reading from the file\n";
    char c;
    f >> c;
	std::cout << c;
    file_123(); // file now contains "123"
    f >> c;
	std::cout << c;
    f >> c;
	std::cout << c << ‘\n‘;
    f.close();

    file_abc(); // file now contains "abc"
    f.open("test.txt");
    std::cout << "Reading from the file, with sync()\n";
    f >> c;
	std::cout << c;
    file_123(); // file now contains "123"
    //f.sync();
    f >> c;
	std::cout << c;
    f >> c;
	std::cout << c << ‘\n‘;
}  

知乎见解:

  为了更好理解,以 std::ifstream f("test.txt"); 为例,对象 f 和磁盘上的文件 test.txt 就是两个相关联但不同的东西。f 有自己的缓冲区用来缓冲从 test.txt 读取的内容。而 sync() 则是强制将 test.txt 的内容「同步」到缓冲区。

比如 test.txt 内容本来是 abc。f 被创建后缓冲区内可能就直接加载了这三个字符,今后的读写就都直接从缓冲区,而非文件本身做了。这样一来,如果此时 test.txt 的内容立即被另一个程序改成了 123,从 f 对象里读取的内容仍旧是 abc。但如果调用 sync(),则缓冲区会同步成 123。

作者:邱昊宇
链接:https://www.zhihu.com/question/40160488/answer/85242357
来源:知乎

输出(编译器g++):

续:

知乎见解:https://www.zhihu.com/question/62580081/answer/199917867

说到底其实这个函数的功能并不是用来清除缓冲区内容的,这个用途只是因为在vs系列编译器带来的副作用而已。当然给出的例子也只能在vs系列编译器上跑出正确的结果。

时间: 2024-12-18 14:56:05

clear()、sync()、ignore()的相关文章

linux命令(10)---echo、wall、write、clear、sync、uptime命令

ehco命令:display a line of text [功能]默认将给出的内容将其直接打印出,在shell中最常用到 [语法] echo option argument [常用选项]-e 激活转义字符 \b:删除前一个字符 \c:最后不加上换行符号 \n:换行且光标移动只行首 \r:光标移动至行首,但不换行 \t:插入tab \\:插入"\"字符 [实例] //直接打印给出的字符串 [[email protected] tmp]# echo "Hello Word&qu

linux 同步IO: sync、fsync与fdatasync

[linux 同步IO: sync.fsync与fdatasync] 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作.这种输出方式被称为延迟写(delayed write) 延迟写减少了磁盘读写次数,但是却降低了文

详解CSS中clear属性both、left、right值的含义

前几天一朋友在群里问clear:left的意思,我以为是简单的清除浮动问题,就让他百度"清除浮动",导致中间有点小误会.后来我按照他写的DEMO,发现我自己也没完全理解clear:left和clear:right的意思.特别看了下手册,和写了几个DEMO,经过群里其他人指导,总结如下,希望对其他人能有点帮助. clear的值有四个 none:允许两边都可以有浮动对象: both:不允许有浮动对象: left:不允许左边有浮动对象: right:不允许右边有浮动对象. 老实说,我没真正理

linux 同步IO: sync msync、fsync、fdatasync与 fflush

最近阅读leveldb源码,作为一个保证可靠性的kv数据库其数据与磁盘的交互可谓是极其关键,其中涉及到了不少内存和磁盘同步的操作和策略.为了加深理解,从网上整理了linux池畔同步IO相关的函数,这里做一个罗列和对比.大部分为copy,仅为记录,请各位看官勿喷. 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓

sync、fsync和fdatasync

转自 http://blog.csdn.net/todd911/article/details/11701847 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘 I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满 或者当内核需要重用该缓冲区以便存放其他磁盘块数据时,再将该缓冲排入输出队列,然后待其到达队首时,才进行实际的I/O操作.这种输出方式被称为延迟写 (delayed wr

同步内核缓冲区 sync、fsync和fdatasync函数

同步内核缓冲区 1.缓冲区简介 人生三大错觉之一:在调用函数write()时,我们认为该函数一旦返回,数据便已经写到了文件中.但是这种概念只是宏观上的.实际上,操作系统实现某些文件I/O时(如磁盘文件),为了保证I/O的效率,在内核通常会用到一片专门的区域(内存或独立的I/O地址空间)作为I/O数据缓冲区.它用在输入输出设备和CPU之间,用来缓存数据,使得低速的设备和高速的CPU能够协调工作避免低速的输入输出设备长时间占用CPU,减少系统调用,提高了CPU的工作效率. 2.不同步的write()

Linux同步IO:sync、fsync和fdatasync

转自:http://blog.csdn.net/sishuiliunian0710/article/details/37739385 一.术语解释       脏页:linux内核中的概念,因为硬盘的读写速度远赶不上内存的速度,系统就把读写比较频繁的数据事先放到内存中,以提高读写速度,这就叫高速缓存,linux是以页作为高速缓存的单位,当进程修改了高速缓存里的数据时,该页就被内核标记为脏页,内核将会在合适的时间把脏页的数据写到磁盘中去,以保持高速缓存中的数据和磁盘中的数据是一致的. 内存映射:内

CLEAR、REFRESH、FREE

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 1.8.  CLEAR.REFRESH.FREE 内表:如果使用有表头行的内表,CLEAR 仅清除表格工作区域.要重置整个内表而不清除表格工作区域,使用REFRESH语句或 CLEAR 语句CLEAR <itab>[].:REFRESH加不加中括号都是只清内表,另外REFRESH是专为清内表的,不能清基本类型变量,但CLEAR可以 以上都不会释放掉内表所占用的空间,如果想初始化内

Linux系统调用---同步IO: sync、fsync与fdatasync【转】

转自:http://blog.csdn.net/cywosp/article/details/8767327 [-] 1  write不够需要fsync 2 fsync的性能问题与fdatasync 3 使用fdatasync优化日志同步 传统的UNIX实现在内核中设有缓冲区高速缓存或页面高速缓存,大多数磁盘I/O都通过缓冲进行.当将数据写入文件时,内核通常先将该数据复制到其中一个缓冲区中,如果该缓冲区尚未写满,则并不将其排入输出队列,而是等待其写满或者当内核需要重用该缓冲区以便存放其他磁盘块数