【问题标题】:fscanf() returns negative valuefscanf() 返回负值
【发布时间】:2013-04-02 14:58:26
【问题描述】:

我正在使用 fscanf() 函数从文本文件中逐行读取数据。它运行良好,但突然间我不知道我犯了什么错误,现在该函数返回一个负值。 下面是我的代码sn-p:

FILE *fp;
char ip[16];
int port;
fp = fopen("ClientInformation.txt", "r");
int size = -1;
while (!feof(fp))
{
    fgetc(fp);
    size++;
}
char buff[1000];
sprintf(buff,"%i",size);
MessageBox(NULL,
           buff,
           "Size",
           MB_ICONINFORMATION);

if(size > 0)
{
    while (fscanf(fp, " %s %d", ip, &port) > 0)
    {
        MessageBox(NULL,"fscanf() Successful","SUCCESS!", MB_ICONINFORMATION);
    }
}

【问题讨论】:

  • 负值可能是错误码,如果不是检查errno变量...
  • 嗯,你的while (!feof(fp)) 循环不是将fp 放在EOF 上吗?
  • 假设它甚至完全打开(从未检查过)。
  • 永远不要在断点条件下使用 feof()
  • contd....我建议每当您调用一个应该返回某些值的函数...始终检查返回值...例如 fopen()....您没有检查它是否返回正常...如果文件不存在怎么办?

标签: c windows winapi scanf


【解决方案1】:

您可能想添加此通话

rewind(fp);

就在之前

while (fscanf(fp, " %s %d", ip, &port) > 0)
{

还应该经常检查系统调用的结果。在您的情况下,主要是 fopen() 是否确实返回了与 NULL 不同的东西。

此外,while(!feof(fp)) 构造很可能不会总是按预期运行 (Why is “while ( !feof (file) )” always wrong?)。你最好按照 WhozCraig 在下面的评论中提出的方式。

【讨论】:

  • 或者更好的是,把第一个 while 扔掉,然后使用 fseek/ftell/fseek。一次一个字符的 fread 似乎有点迟钝,只是为了确定文件大小 =P
  • 非常感谢大家:)。添加 rewind(fp) 解决了这个问题,但我仍然不清楚这是怎么发生的。我是新手,请解释一下。
  • @AyeshaHassan:关于rewind() 的内容,您可能想在这里阅读:msdn.microsoft.com/en-us/library/fes6c2yd(v=vs.110).aspx 了解了这一点后,您可能会明白是什么原因需要调用rewind()。
【解决方案2】:

您无需提前确定文件大小。只需fscanf()文件并检查返回值:

int ret;

while ((ret = fscanf(fp, " %s %d", ip, &port)) == 2) {
    MessageBox(NULL,"fscanf() Successful","SUCCESS!", MB_ICONINFORMATION);
}

switch (ret) {
    case EOF:
        /* EOF or error, check errno */
        break;
    case 0:
    case 1:
        /* bogus file contents */
        break;
    default:
        fprintf(stderr, "Philip says this cannot happen, but it did.\n");
        exit(EXIT_FAILURE);
}

另外:总是检查函数调用的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 2018-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多