为什么fgets在第一行之后没有阅读?

时间:2016-05-01 05:23:40

标签: c io fgets fseek

我有一个文本文件,文本文件的每一行包含3个整数,如下所示。

8 168 0
10 195 0
4 71 0
16 59 0
11 102 0
...

因为文件很大,我希望使用fseek和fgets编写一个可以返回文件中任意一行的函数。在example之后,我写了一个看起来像这样的函数:

/* puts example : hello world! */
#include <stdio.h>

int main ()
{      
  FILE* pFile;
  char mystring [10];

  pFile = fopen ("in/data_3" , "r");
  fseek(pFile, 3, SEEK_SET);
  if ( fgets (mystring , 10 , pFile) != NULL ){
    puts (mystring);
  }

  fclose (pFile);
}

但是,上述程序返回68 0。当我更改为fseek(pFile, 7, SEEK_SET);时,它不会返回任何内容。当我更改为fseek(pFile, 10, SEEK_SET);时,它会返回195 0。似乎每行中的字符数不固定,并且换行不知何故不能返回超过1行。如何编写函数使得它在不知道整数大小(可以是0到数千)的情况下返回完整的行?

1 个答案:

答案 0 :(得分:0)

  

如何在不知道整数大小(可以是0到数千)的情况下编写函数,使其返回完整的行?

编写一个可以跳过N行数的函数。

void skipLines(FILE* in, int N)
{
   char line[100]; // Make it as large as the length of your longest line.
   for ( int i = 0; i < N; ++i )
   {
      if ( fgets(line, sizeof(line), in) == NULL )
      {
         // N is larger than the number of lines in the file.
         // Return.
         return;
      }
   }
}

然后将其用作:

pFile = fopen ("in/data_3" , "r");
skipLines(pFile, 3);
if ( fgets (mystring , 10 , pFile) != NULL ){
  puts (mystring);
}