0
#include <stdio.h>
int main(void)
{
   clrscr();
   FILE *fin;

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

   if(fin==NULL)
   {
    printf("can not open input fil");
    return 0;
   }

   long data[2];

   while(!feof(fin))
   {
       fscanf(fin,"%ld %ld",&data[0],&data[1]);
       printf("\n%ld %ld",data[0],data[1]);
   }
   fclose(fin);
   return;
   }

以上是我从文件中读取表格的 c 代码。在那个 ..last 值中打印了 2 次!!!

data.txt
1   34
2   24
3   45
4   56
5   67

但是我无法通过如下所示的损坏表获得正确的值...我该如何解决?(在这里它应该在找不到任何值的情况下工作,它应该返回“空空间”或零..但不是下一个值..)

data.txt
1   34
2   
3   45
4   
5   67

以及data.txt

1 34
  57
3 45
4   
5 34
4

2 回答 2

2

以上是我从文件中读取表格的 c 代码。在那个 ..last 值中打印了 2 次!!!

由于文件读取循环的结构,最后一个值打印了两次。eof()直到尝试读取文件末尾之后才会设置该标志。当从文件的最后一行fscanf()读取最后两个s还没有设置但下一次调用失败并设置但没有立即查询结果时,导致使用之前提取的s:检查所有读取操作的结果立即地。longeof()fscanf()eof()fscanf()long


一种可能的解决方案是一次读取一行,使用fgets(),然后使用从读取的行sscanf()中提取long值。如果fscanf()使用,它将读取换行符以定位第二个请求的字符long,这不是所需的行为。

例如:

char line[1024];
while (fgets(line, 1024, fin))
{
    /* Assign appropriate default values.
       sscanf() does not modify its arguments
       for which it has no value to assign.
       So if 'line' has a single long value
       data[1] will be zero. */
    long data[2] = { 0, 0 };

    /* You can use 'result' if you require to take particular
       action if it reads only 1, or 0, items. */
    int result = sscanf(line, "%ld %ld", &data[0], &data[1]);

    printf("\n%ld %ld",data[0],data[1]);
}

响应问题更新)区分缺少第二个值的行:

2

以及缺少第一个值的行:

57

需要一个有效范围(或其他一些标准)来确定该行中缺少哪个值(第一个或第二个):

int result = sscanf(line, "%ld %ld", &data[0], &data[1]);
if (1 == result)
{
    if (data[0] >= 1 && data[0] <= 9)
    {
        printf("\n%ld 0", data[0]);
    }
    else
    {
        /* Read value was the second value. */
        printf("\n%ld %ld", ++last_first_value, data[0]);
    }
}

其中last_first_valuealong存储第一个值的当前值(最后一次成功读取的第一个值或根据最后一次成功读取的第一个值计算得出)。

于 2012-10-29T11:26:25.383 回答
0
while(!feof(fin))
{
   fscanf(fin,"%ld %ld",&data[0],&data[1]);
   printf("\n%ld %ld",data[0],data[1]);
}

feoftrue直到您尝试读取文件末尾之后才会返回,因此循环将经常执行一次。最好检查返回值,fscanf如果它与您期望的不匹配(在本例中为 2),检查 EOF。这是一种可能的重组:

int good = 1;
while (good)
{
  int itemsRead = fscanf(fin, "%ld %ld", &data[0], &data[1]);
  if (itemsRead == 2)
  {
    // process data[0] and data[1] normally
  }
  else 
  {
    good = !good;
    if (feof(fin))
      printf("Hit end of file\n");
    else if (ferror(fin))
      printf("Error during read\n");
    else
      printf("Malformed input line\n");
  }
}
于 2012-10-29T15:58:55.110 回答