【问题标题】:Misunderstood the usage of cin.unget() while handling I/O files C++在处理 I/O 文件 C++ 时误解了 cin.unget() 的用法
【发布时间】:2015-08-14 10:13:10
【问题描述】:

例如,我有一个名为 Bjarne.txt 的文件,其中包含整数:

16   2   3   4

我已经编写了一个程序来读取文件中可用的整数并在控制台窗口中将它们输出给我,但是,我正在尝试使用 cin.unget() 并由此了解它的实际作用,这里是源代码:

#include <iostream>     
#include <fstream>      
using namespace std;

int main () {
ifstream ifs("Bjarne.txt");
int a;
for(int i = 0;i<4;++i){
   ifs>>a;
   cout<<endl<<a;
   if(i==0){
   ifs.unget();
   }
}

输出是:

16 6 2 3

为什么是这样的输出? (应该是16 2 3 4),只有当我把 ifs.unget() 放入程序时才会出现,所以我的问题是,使用 I/O 文件时 cin.unget() 的目的是什么,为什么是数字6(作为 16 的一部分)输出?

提前感谢您的帮助。

【问题讨论】:

  • 当您不了解cin.unget() 的作用时,为什么还要尝试使用它?你为什么不阅读它的文档来找出答案?
  • 那么,你得到答案了吗?

标签: c++ file io fstream cin


【解决方案1】:

the documentation 有问题吗?

使最近提取的字符再次可用。

在您的第一次循环迭代结束时,6 是最后一个提取的字符(作为提取的格式化 int 的最后一位数字,值为 16)。

Unget 正是这样做的:它 un-得到它。

下一个操作需要使用 6。所以,惊喜,下次你会收到6

【讨论】:

  • 假设我有这样的代码:ideone.com/lh9YeA 如果我输入例如 "123456" ,输出将是 "123456" ,如果没有 cin.unget() ,输出将是“23456”,因此,它不一定(cin.unget())使最近提取的字符再次可用,但在上面链接的示例中使第一个字符再次可用,为什么?
  • @zLeon:因为你在main 的开头有一个cin.get() 操作,它吃掉了第一个数字......你不是在阅读你自己的代码伙伴! unget 确实 完全按照它的广告宣传。 unget提取到a 之前,所以我不知道你在谈论这个“第一个字符”业务是什么。在执行 unget 时,它确实使最近提取的字符 (1) 再次可用。
猜你喜欢
  • 2018-05-20
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多