fscanf()接受输入

时间:2011-09-09 21:18:41

标签: c scanf

这是我的代码:

FILE* fp,*check;
fp=fopen("file.txt","r");
check=fp;
char polyStr[10];
while(fgetc(check)!='\n')
{
    fscanf(fp,"%s",polyStr);
    puts(polyStr);
    check=fp;
}
while(fgetc(check)!=EOF)
{
    fscanf(fp,"%s",polyStr);
    puts(polyStr);
    check=fp;
}

现在,如果我的file.txt是:

3,3, 4,4, 5,5
4,1, 5,5, 12,2

现在输出是:

,3,
4,4,
5,5,
,1,
5,5,
12,2,

现在为什么这两行的第一个字符都没有被读取?

2 个答案:

答案 0 :(得分:4)

您的fgetc来电正在吃这个角色。

您应该使用fgets阅读整行,然后使用strtol系列解析它们。你永远不应该使用任何*scanf函数。

答案 1 :(得分:0)

首先让我们谈谈输入数据的格式。如果您只有<coef>,<exp>而没有逗号,则您的列表似乎会更好地格式化。通过这种方式,您将拥有一个匹配的漂亮模式。所以你可以这样做:

fscanf(filep, "%d,%d", &coef, &exp)

获取值。您应该检查fscanf的返回值,以确保您正在读取2个字段。因此,如果一行的格式是以下“<coef>,<exp><white-space>”的一组(其中空格是一个空格或一个换行符,那么您将能够执行以下操作:

do {
    fscanf(filep, "%d,%d", &coef, &exp);
} while (fgetc(filep) != '\n');

此代码允许您获取对,直到您吃掉行尾。 while条件将使用空格或换行符。您可以将其包装在另一个循环中以处理多行。

请注意,我没有测试过这段代码,但其中的要点应该是清楚的。如果您还有其他问题,请评论。