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

「含める」を省略しましたが、その部分は正しいです。

この場合の出力は、同じ行が 2 回です。

誰でも私を助けてもらえますか?

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

補足:タスクはI / Oに関連していますが、説明からは、ファイルから読み取ったデータには何の影響も及ぼさないように見えます(エコーバックすることを除けば)。これはおそらく適切な解決策を混乱させます。

私は言語構文を超えて、意図されたプログラム機能に焦点を合わせようとします。1つのアプローチでは、プログラムの状態構造/ハンドルを定義して、ファイルポインター、行番号、バッファーなどを含めることができます。次に、関数はハンドルから状態を取得し、ファイルから次の行をファイルに読み込みます。

したがって、フローは次のようになります。 init(appstate, filename) ==> loop:{ read_file(appstate) ==> process_line(appstate) } ==> end(appstate)

これにより、プログラムフローがより明確になり、プログラムの状態を明示的に定義することで静的変数の使用を回避できます。

于 2012-09-12T15:09:56.847 に答える
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 に答える