我目前正在研究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的初学者,欢呼。
答案 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');
}