我的输入文件如下所示:
1 2 3 4: 0:: 3 4 5
我需要一个简单的阅读和打印的东西。我不知道结肠的确切行为。可以有任意数量的数字,因此while != EOF
必须保留。
#include <stdio.h>
int main()
{
FILE *p = fopen("in", "r");
char c;
while ((c = fgetc(p)) != EOF) {
if (c == ':')
continue;
int i;
fscanf(p, "%d", &i);
printf("%d, ", i);
}
return 0;
}
上面的输出1 是:
2, 3, 4, 0, 3, 4, 5
输出2 如果我评论条件,则输出为:
2, 3, 4, 0, 0, 3, 4, 5
我希望找到一个更好的解释结肠行为的方法。
更新
对于输出1,问题是我已经读过while c = fgetc(p)
内的第一个字符。以下似乎通过返回一个字符来解决这个问题。
#include <stdio.h>
int main()
{
FILE *p = fopen("in", "r");
char c;
while ((c = fgetc(p)) != EOF) {
if (c >= '0' && c <= '9')
ungetc(c, p);
if (c == ':')
continue;
int i;
fscanf(p, "%d", &i);
printf("%d, ", i);
}
return 0;
}
答案 0 :(得分:0)
您需要跳过所有非数字字符,而不仅仅是冒号。这是因为序列": :4"
会导致您的代码跳过第一个冒号,然后无法将" :4"
读作int
。
试试这个:
while ((c = fgetc(p)) != EOF) {
if (! isdigit(c)) // skip non-digits
continue;
ungetc(c,p); // put the digit back to the stream
int i;
fscanf(p, "%d", &i); // read a number
printf("%d, ", i);
}