使用方法在C中“动态”逐行读取文件

时间:2012-09-12 12:30:08

标签: c readfile

我有一个文件,我想逐行阅读,但它必须动态完成,这意味着它只应该在我调用方法时读取一行。一旦我下次调用该方法,它应该读取文件的下一行,依此类推。 到目前为止,我只是成功地读取了文件中的所有行,或者一遍又一遍地读取同一行。

以下是我的代码:

文件方法:

int getNextData(){
static const char filename[] = "file.txt";
   FILE *file = fopen ( filename, "r" );
   if ( file != NULL )
   {
      char line [ 5 ]; /* or other suitable maximum line size */

      if ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
      {
         fputs ( line, stdout ); /* write the line */
      }
   }
   else
   {
      perror ( filename ); /* why didn't the file open? */
   }
   return 0;
}

主文件:

int main () {
     // this should give me two different numbers
getNextData();
    getNextData();
return 0;
}

我遗漏了“包含”,但那部分是正确的。

这种情况下的输出是同一行两次。

有人可以帮助我吗?

3 个答案:

答案 0 :(得分:3)

问题很可能是您每次都打开文件,从而重置文件指针。尝试在主函数中打开一次,然后将文件句柄传递给函数进行读取。

以下是一些适合您的修改后的代码:

#include <stdio.h>

int getNextData(FILE * file){

   if ( file != NULL )
   {
       char line [ 5 ]; /* or other suitable maximum line size */

       if ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */       
       {          
          fputs ( line, stdout ); /* write the line */       
       }    
   }    

  return 0; 
}

int main () {      // this should give me two different numbers 
  static const char filename[] = "file.txt";
  FILE *file = fopen ( filename, "r" );
  getNextData(file);     
  getNextData(file); 
  return 0; 
} 

使用此代码,给出文件:

mike@linux-4puc:~> ls -l file.txt
-rw-r--r-- 1 mike users 15 Sep 11 18:18 file.txt
mike@linux-4puc:~> cat file.txt
bye
sh
ccef

我看到了:

mike@linux-4puc:~> ./a.out 
bye
sh

答案 1 :(得分:0)

您需要以某种方式维护状态,在这种情况下,在您所在的文件中,在调用之间。

最简单的方法是让FILE *生效:

int getNextData(void) {
  static const char filename[] = "file.txt";
  static FILE *file = NULL;

  if( file == NULL )
    file = fopen ( filename, "r" );

  /* rest of function */
}

请注意,这有点难看,因此无法使用(因为函数为void),例如重新开始阅读,文件结束时会发生什么?但这是最简单的方法。你应该能够以此为基础。

答案 2 :(得分:0)

只是注意事项:您的任务与I / O相关,但从您的描述中看起来它对您从文件中读取的数据没有任何作用(除了回复它)。这可能会使合适的解决方案变得混乱。

我试图超越语言语法,专注于预期的程序功能。在一种方法中,您可以定义程序状态结构/句柄以包含文件指针,行号,缓冲区等。然后,您的函数将从句柄中获取状态并从文件中读取下一行。

所以流程可能是: init(appstate, filename) ==> loop:{ read_file(appstate) ==> process_line(appstate) } ==> end(appstate)

这使得程序流更清晰,并通过明确定义程序状态来避免使用静态变量。