1

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

这是我的代码片段:

带有方法的文件:

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

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

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

谁能帮帮我吗?

4

3 回答 3

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
于 2012-09-12T12:33:05.450 回答
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)无法重新开始读取,当文件结束时会发生什么?但这是最简单的方法。您应该能够以此为基础。

于 2012-09-12T12:32:56.377 回答
0

附带说明:您的任务与 I/O 相关,但从您的描述来看,它似乎对您从文件中读取的数据没有任何作用(除了回显它)。这可能会混淆合适的解决方案。

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

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

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

于 2012-09-12T15:09:56.847 回答