02头文件的冲突导致,清除缓冲区失败之cin.ignore() 问题

简介: 输入任意多个整数, 把这些数据保存到文件data.txt中.如果在输入的过程中, 输入错误, 则提示用户重新输入.指导用户输入结束(按ctrl + z)[每行最多保存4个整数]可能遇到的 cin.ignore();问题

输入任意多个整数, 把这些数据保存到文件data.txt中.

如果在输入的过程中, 输入错误, 则提示用户重新输入.

指导用户输入结束(按ctrl + z)

[每行最多保存4个整数]


可能遇到的 cin.ignore();问题

20200623180129379.png


话不多说直接上代码


#include<fstream>
#include<iostream>
using namespace std;
int main(void) {
  int number;
  int n = 0;
  ofstream out;
  out.open("data.txt");
  if (!out.is_open()) {
    cout << "文件打开失败" << endl;
    exit(1);
  }
  while (1) {
    cout << "请输入一个整数:";
    cin >> number;
    if (cin.eof()) {
      break;
    }
    //如果输入错误,需要反复重复输入
    while (cin.fail()) {
      cin.clear();//清除错误标志
      //cin.sync(); //VS 中无效
      cin.ignore(std::numeric_limits<streamsize>::max(), '\n');
      cout << "输入错误,请重新输入:";
      cin >> number;
    }
    //写入文件到数据
    out << number << "\t";
    if (++n % 4 == 0) {
      out << endl;
    }
  }
  out.close();
  system("pause");
  return 0;
}


运行结果:

20200623175655504.png

20200623175709345.png

重点是:因为sync在Vs的编译器无效我们也不好用getchar()来读取(不确定长度),所以只好采用下面的方法了

20200623175743440.png

cin.ignore(count, a);

从输入流中提取并丢弃字符,直到遇到下列三种情况

1.提取的字符达到了参数count指定的数量

2.在输入序列中遇到文件结束(EOF)

3.输入序列中的下一个字符为参数a指定的字符(这个字符会被提取并丢弃)


count常常取:

std::numeric_limitsstd::streamsize::max() 相当于IO流的最大字符个数


常见用法:(把标准输入缓冲区cin的所有数据都清空)

cin.ignore(std::numeric_limits::max(), ‘\n’);


但是有时候会遇到的问题就是如图所示:

20200623180107742.png

20200623180015525.png

后面博主也是翻阅资料才知道,遇到这个问题是加了头文件(Windows.h)造成的,所以你看博主前面的代码是没有刚刚个头文件的。

即:如果在程序中同时导入limits.h和windows.h,并使用numeric_limits::max()或numeric_limits::min()就会发生编译错误:


目录
相关文章
|
6月前
|
消息中间件 Kubernetes NoSQL
实现上下文保存和恢复的一种方式--setjmp与longjmp
实现上下文保存和恢复的一种方式--setjmp与longjmp
|
BI
解决File.delete()删除不掉文件
首先注意两点: 此文件被使用的时候无法删除(比如网络输出没关闭流) 判断此文件是否存在再做删除(exists) 删除文件夹之前先删除文件夹下的所有文件(递归解决) 判断是否删除成功会有返回值,文件名错了的话,删除文件不会报错。
2311 0
|
29天前
|
存储 编译器 C语言
如何在 C 语言中判断文件缓冲区是否需要刷新?
在C语言中,可以通过检查文件流的内部状态或使用`fflush`函数尝试刷新缓冲区来判断文件缓冲区是否需要刷新。通常,当缓冲区满、遇到换行符或显式调用`fflush`时,缓冲区会自动刷新。
CString的GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定
CString的GetBuffer()主要作用是将字符串的缓冲区长度锁定,releaseBuffer则是解除锁定
219 0
VS2017报错:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'strcpy': This function or variable may be unsafe. Consid
VS2017报错:严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C4996 'strcpy': This function or variable may be unsafe. Consid
681 0
|
SQL
[20180626]延迟块清除与只读表.txt
[20180626]延迟块清除与只读表.txt --//以前测试过延迟块清除与只读表空间的情况.今天测试只读表的情况. --//链接:[20150409]只读表空间与延迟块清除.
1268 0
|
缓存 Java
flag -- 诡异的memcache标记
引子         打从去年一路北漂,进入无人货架行业,业务需求漫天飘,最近总算把工作都规划齐整。回望过去一年多的时间里,诸多东西值得整理,memcache就是其中一个。    看到java的工资高些,队伍中好些人都想学习java,美其名曰:技术多元化。
1623 0