【问题标题】:Why does the file pointer stuck when I try to input char to int?当我尝试将 char 输入到 int 时,为什么文件指针会卡住?
【发布时间】:2019-11-18 13:06:39
【问题描述】:

在尝试使用 c++ 从 .txt 文件中读取数据时,我遇到了一个奇怪的现象,即我的程序在尝试将 char 输入到 int 变量(例如到 a1)时会卡在 while 循环中。

我知道如果我将int a1 = 0; 更改为char a1;,可以解决以下代码的问题。我的问题是为什么文件指针会在它遇到的第一个字符处停止?我认为它只会将字符转换为 ASCII 整数,或者只是跳过它,就好像它是一个制表符或空格一样。

下面是我用来测试的代码。

#include<iostream>
#include<fstream>
using namespace std;
int main(){
    ifstream in;
    int a1=0;
    int a2=0,a3=0,a4=0;
    in.open("input.txt");
    while(!in.eof()){
        in >> a1 >> a2 >> a3 >> a4;
        cout << a1 << " "<< a2 << " "<< a3 << " "<< a4<<endl;
        cout << SEEK_CUR <<endl;
    }
    return 0;
}

以下是“input.txt”

a         42          94          32    
b         33          19          82    
c         88          40          18    
d         92          45          19    
e         77          25          84    

输出是

0 0 0 0
1
0 0 0 0
1
0 0 0 0
1
.
.
and so on

【问题讨论】:

  • "我的问题是为什么文件指针会停在它遇到的第一个字符处?" - 因为这是设计决定。 “我认为它只会将字符转换为 ASCII 整数,或者只是像制表符或空格一样跳过它”——当然可以,但负责人却选择了其他方式。行为是这样的,问为什么是这样的,在这种情况下,是毫无意义的,除非被问到做出那个决定的人。我们现在可能只是推测 - 这似乎是最直观的方法。
  • 你想读取一个int,但是遇到'a',它不是一个int,所以读取停止。这就是全部的魔力......
  • “我认为它只会将字符转换为 ASCII 整数或直接跳过它”。所以事实证明并非如此。现在怎么办?你有 B 计划吗?
  • @n.'pronouns' 是的,只需将 a1 的类型更改为 char。
  • @Fureeish thx 我想这是最合理的解释。

标签: c++ file-io type-conversion fstream


【解决方案1】:

istream 中的操作是类型安全和类型敏感的。

operator&gt;&gt;:

如果提取失败(例如,如果在需要数字的地方输入了字母),则值保持不变并设置失败位。 (直到 C++11)

如果提取失败,则将零写入 value 并设置 failbit。如果提取导致值太大或太小而无法放入值,则写入 std::numeric_limits::max() 或 std::numeric_limits::min() 并设置故障位标志。 (C++11 起)

基本上,您无法读取任何数据 - 因此,您无法到达文件末尾 - 这就是无限循环的原因。

【讨论】:

    猜你喜欢
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多