【问题标题】:Read from a file of chars and print a file of integers从字符文件中读取并打印整数文件
【发布时间】:2021-04-02 12:58:32
【问题描述】:

在我的 fgetc.in 文件中我有 9,而在 fgetc.out 中它显示的是 41 而不是 9。我很困惑我的代码有什么问题,但我猜是 EOF 有问题。

#include<stdio.h>


int main(){
    FILE *in = fopen("fgetc.in", "r");
    FILE *out = fopen("fgetc.out", "wt");

    char c;
    int a = 0;
    c = fgetc ( in );
    a = c - '0';
    while(c != EOF ){
        c = fgetc ( in );
        a = a * 10 + (c - '0');
    }
    fprintf(out, "%d" , a);

    fclose(in);
    fclose(out);
    return 0;
}

【问题讨论】:

  • @RussBear atoi() 的参数是字符串,而不是单个字符。
  • c - '0' 是将单个数字转换为相应整数的正确方法。
  • 你说得对,我实际上把char cchar* c 混淆了。我以前从未见过c - '0',谢谢。
  • 您的输入文件中可能有其他字符(例如空格或换行符)。你没有做任何事情来避免它们,所以如果它们是数字,它们最终会进入你的值计算。

标签: c char integer


【解决方案1】:

您正在测试while 条件中EOFprevious 读取字符。因此,在您读取文件中的最后一个字符后,您将读取另一个字符并将其添加到a。下一个字符将是EOF,其值为-1。所以你会计算

a = 9 * 10 + (-1 - '0');

这是41

您需要在读取字符后但在使用它之前检查 EOF。

另外,fgetc() 返回int,而不是char,因为char 可能无法保存EOF 值。您需要将c 声明为int

#include<stdio.h>

int main(){
    FILE *in = fopen("fgetc.in", "r");
    FILE *out = fopen("fgetc.out", "wt");

    int c;
    int a = 0;
    while(1){
        c = fgetc ( in );
        if (c == EOF) {
            break;
        }
        a = a * 10 + (c - '0');
    }
    fprintf(out, "%d" , a);

    fclose(in);
    fclose(out);
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多