【问题标题】:My fscanf outputs a large negative number我的 fscanf 输出一个很大的负数
【发布时间】:2016-08-22 15:04:21
【问题描述】:

在这个程序中,我试图从一个文件中读取一个名字和他们的 GPA。第一个名字是 Audrey,然后是一个空格,然后是 3.6。 第二行是 Oakley,然后是空格,然后是 3.5。

int main()
{
    FILE * fPtr;
    FILE * fPtr2;

    char x[10] = { "Oakley " };
    double y;
    int z;

    fPtr = fopen("data.txt", "r");

    if (fPtr == NULL) // open failure
        puts("File open for read failed");
    else
    {
        while (scanf("%d", &z) != EOF)
        {
            fscanf(fPtr, "%s", x);
            fscanf(fPtr, "%lf", &y);
            fprintf(stdout, "Value read = %s\n", x);
            fprintf(stdout, "GPA = %lf \n", y);
        }
    }

    fclose(fPtr);
    system("pause");
    return 0;
}

所以,我之前尝试过一次,它成功了。在那次尝试中,“x[10] = Audrey”,这是列表中的第一个名字。它奏效了,fscanf 给了我她的 GPA。第二次,我尝试扫描 Oakley,我仍然得到 Audrey,但是当我删除该行时,我得到一个非常大的负数。

我使用 fscanf 是因为它在空格周围进行标记,所以我的理论是,如果光标到达正确的名称,那么它将读取下一个数字,这将是 GPA?正确的?如何让它搜索 Oakley?

【问题讨论】:

  • 你需要先修复你代码中的一些基本错误,比如fPtr2从不初始化,然后传递给fclose(),你不检查各种函数的返回值喜欢fscanf()
  • fscanf 并不像您想象的那样“搜索”。它只从当前文件位置读取输入,并根据您指定的格式解析读取的内容。
  • 我认为你的同学也在stackoverflow上做same homework
  • 好的,我删除了所有涉及 fPtr2 的内容。那是为了以后。现在我无法将文件位置放到我想要的位置?我该怎么做?
  • 您不能直接跳到所需的条目,因为您事先不知道它在哪里。您需要做的是阅读每一行,然后使用strcmp 检查名称是否是您想要的名称。如果不是,则继续读取输入。如果是,那么您已经找到它并可以打印结果。

标签: c file scanf negative-number


【解决方案1】:

您需要检查scanf 是否有任何错误,这可能是因为输入文件与您指定的格式不匹配。尝试以下更改:

char user[100];

while (scanf("%s", user) == 1) {

    while (fscanf(fPtr, "%s %lf", x, &y) == 2)
    {
        if (strcmp(user, x) == 0) {
            fprintf(stdout, "GPA for %s is %lf \n", user, y);
            break;
        }
    }
    rewind(fPtr);
}

另外,fPtr2 在您的代码中未初始化,请删除行 fclose(fPtr2)

【讨论】:

  • 哇,这给了我太多的哈哈。我有一个 while 语句读取文件直到最后,但我正在寻找一种方法来找出特定名称,然后打印它旁边的数字。
  • @JeremyMorgan 在您的原始代码中使用z 的目的是什么?
  • 我的目的是因为我想说“当用户选择运行程序时......”因为我们必须要求用户输入名称然后输出 GPA。当我让它寻找特定的 x[10] 时,我会将 x[10] 设为用户输入字符串,z 将用于检查是否继续
  • 这段代码丢弃了第一行读取的项目;然后在没有错误检查的情况下执行读取......当然这不是预期的
  • @JeremyMorgan 所以你只想输出匹配用户的 GPA,这是交互式输入的?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-19
  • 1970-01-01
  • 2014-07-20
  • 1970-01-01
相关资源
最近更新 更多