2013-04-02 75 views
2

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

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); 
    } 
} 
+1

负值可能是一个错误代码,如果不检查errno变量... – stdcall

+1

嗯,是不是你的'while(!feof(fp))'循环把'fp'放在'EOF'? –

+2

假设它甚至可以打开(从不检查)。 – WhozCraig

回答

3

你可能会喜欢之前

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

添加此调用

rewind(fp); 

另外一个要经常检查系统调用的结果。在你的情况下,主要是否fopen()确实返回与NULL不同的东西。

此外,while(!feof(fp))构造大多可能不会像预期的那样运行(Why is “while (!feof (file))” always wrong?)。您最好在WhozCraig建议的方式下面的评论(s)。

+3

或者更好的是,只需扔掉第一个,然后使用fseek/ftell/fseek。一次一字符的fread似乎有点迟钝只是为了确定文件大小= P – WhozCraig

+0

感谢所有人:)。 添加倒带(fp)解决了这个问题,但我不清楚这是怎么发生的。所有这些我都是新手,请解释一下,如果可以的话。 – Ayse

+1

@AyeshaHassan:关于什么'rewind()'你可能想在这里阅读:http://msdn.microsoft.com/en-us/library/fes6c2yd(v=vs.110).aspx了解这个,你也许看看有什么必要调用'rewind()'。 – alk

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); 
} 

另外:经常检查函数调用的返回值。