从存储在文件中的数字中读取个别数字

时间:2012-12-21 14:56:04

标签: c

我目前正在研究Project Euler问题作为一种学习C的方法,我遇到问题#8的问题,程序的实际数学和主要部分很好,但该方法需要从大数据中读取个别数字( 1000个数字),我把它放在一个文件中。

以下代码用于测试用例,其中我的文件“test.txt”是数字“123456789”。我想要做的是在一个单独的行上打印出每个数字。

#include <stdio.h>

int main()
{
    int c = 0;
    FILE *fp;
    fp = fopen("test.txt", "r");

    while(c != EOF)
    {
        c = fgetc(fp);
        printf("%i\n", c);      

    }

    fclose(fp);

}

当我运行此代码时,我得到了输出

49
50
51
52
53
54
55
56
57
10
-1

我有预感我从代码中遗漏了一些非常简单的东西,我希望它在fgetc位。如果是这种情况,那将是一个更好的功能使用,我也很好奇为什么我得到这么奇怪的输出 - 当我用我的1000位数字尝试它时,我发现一个类似的模式,数字大约在49到50之间几乎周期性地输出。请记住,我只是C的初学者,欢呼。

4 个答案:

答案 0 :(得分:2)

数字为ASCII

48 = '0'
49 = '1'
50 = '2'

等。它们采用这种格式,因为它们是存储在表示整数位的文本文件中的字符。

您需要打印:

if((48 <= c) && (c <= 57))
  printf("%d\n", c - '0');

注意:你需要进行if检查,因为10是换行符,-1是EOF,你打印的时间比你想要的多。

当然,如果检查,有很多方法可以做到这一点:

if(('0' <= c) && (c <= '9'))

if(isdigit(c))

关键在于您需要检查是否只需要数字。

答案 1 :(得分:1)

printf("%i\n", c);打印每个号码的ascii character code

下面的代码检查每个字符是否为数字然后打印数字(通过减去0的字符代码)或者如果遇到非数字内容则发出警告:

while(c != EOF) {
    c = fgetc(fp);
    if (isdigit(c)) {
        printf("%i\n", c-'0');
    }
    else {
        printf(" non-numeric digit (%i)\n", c);
    }
}

答案 2 :(得分:1)

这看起来像是在打印数字的ASCII值。以下是wikipedia上的ASCII表格的片段:

Dec Hex Glyph
48  30  0
49  31  1
50  32  2
51  33  3
52  34  4
53  35  5
54  36  6
55  37  7
56  38  8
57  39  9

最后得到的10-1是换行符和EOF

当您从文件中读取文本时,它会为您提供ASCII字符数据,因此您需要从值中减去字符“0”的偏移量来获取数字:

printf("%d\n", c - '0');

请注意,您可以直接在减法中使用'0'字符,因为编译器会将其转换为适合您的数字。最好使用''0'而不是仅减去48,因为它更清楚你想要做什么,还因为可能有不同的字符编码。

答案 3 :(得分:0)

您正在打印每个数字的ASCII值并打印EOF,因为您在阅读之前检查而不是之后:

while((c = fgetc(fp)) != EOF)
{
    printf("%i\n", c-'0');
}