【问题标题】:fscanf() to take inputfscanf() 接受输入
【发布时间】:2011-09-09 21:18:40
【问题描述】:

这是我的代码:

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,

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

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    您的fgetc 电话正在吞噬角色。

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

    【讨论】:

    • 如何防止这种情况发生?这是我使用 check 而不是 fp 的唯一原因。如果 check 增加,为什么 fp 也会增加?
    • 好的,我可以使用 fseek.. 但是为什么我在做 fgetc(check) 时 fp 会改变??
    • checkfp 是指向 same FILE 对象的两个不同指针。要获得两个独立的FILE 对象,您必须调用fopen 两次。但不要那样做,也不要使用fseek。使用fgets阅读整行。
    • “从不”是一个强有力的词,但在 100 个简单的 scanffscanf 中,有 99 个是疯狂的路径。
    • @Zack 以及 fgets 将如何帮助我。我不知道我的行会有多大.. 我不会声明那么大的数组,尽管我必须将文件的两行分成两个不同的列表,因为它们代表带有 coeff 和 exp 的多项式.
    【解决方案2】:

    我们先说一下输入数据的格式。如果您只有 <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 条件将吃掉空白或换行符。您可以将其包装在另一个循环中以处理多行。

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

    【讨论】:

    • 如果我的输入是3,2 等等,那么fscanf(fp,"%d,%d",&cof,&exp)会变成cof=3exp=2。为什么分隔两者的逗号不存储在exp 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多