2011-03-18 4 views
0

私はfgets();FEOFは、動作するようには思えない - テキストファイル

を使用してテキストファイルから行を読んでいる私はループを持って:while(!feof(fp))

事はプログラムがループに入る続け、あります私が最後の行に到達して読み込んだ後でさえ、デバッグでは、ファイルptrはドットだけを表示し、データ列は表示しません。

私が最後に到達したことを知り、再びループに入ることはできません。

 while (!feof(fp)) { 
      if (strcmp(data2->ID ,data1->ID)<0) { 

       fseek(fp, backTo, SEEK_SET); 
       fprintf(fp, "%s",lin2); 
       fprintf(fp, "%s",lin1); 

       flag = 1; 
      } 
      else 
      { 
       strcpy(data1->ID,data2->ID); 
       strcpy(data1->name,data2->name); 
       data1->price=data2->price; 

      } 

      if(fgets(line2, sizeof(line2),fp)!=NULL) 
      { 
       itemSize2=strlen(line2)+1; 
       strcpy(data2->ID,strtok (line2,",")); 
      } 

     } 

、私はその後、私は二回fprintfの使用およびそれらのライン上の書き込みfseek関数を使用して、ファイルの初めに行くよテキストファイル内の唯一の2行は、私がEOF

に到達する必要があり、その後、あります
+2

もっとコードしてください。 – svens

+0

コードを単純化して、まだ誤動作していないか確認してください。まず、fsetはeofフラグをリセットするかもしれません。 – Arkadiy

答えて

4

ループに1回入るということですか?

feof(fp)は、プログラムがファイルの最後まで読み込もうとしたときにtrueを返します。システムは、ファイルがもっとあるかどうかを必ずしも知っているわけではありません(動的に生成されるかもしれませんが、stdinが標準的な例です)。

あなたは、各fgets(fp)feof(fp)をテストする、またはfgets(fp)によって返された文字数を確認するテスト、または1文字getungetを行う必要があります。

+0

それはループを入力し続けると、ファイルの末尾に達したときにわからない – Nadav

+0

@Nadav:あなたはもっと正確になるでしょうか?最後の入力を読み込んだ後、または同じ実行で複数回、 'while'ループ本体に一度入りますか? –

+0

ファイルが2行だけ上にあるfseek呼び出しがあり、ファイルに2行しかありません。fprintfを使って上書きします。それらを上書きした後、fgetsを使用してeofを呼び出す必要がありますwhileループで永遠に – Nadav

-1

まあ、私はこのカスタム関数を使用し....

BOOL CheckFileEnd(FILE *fp) 
{ 
    BOOL res; 
    long currentOffset = ftell(fp); 

    fseek(fp, 0, SEEK_END); 

    if(currentOffset >= ftell(fp)) 
     res = TRUE; 
    else 
     res = FALSE; 

    fseek(fp, currentOffset, SEEK_SET); 

    return res; 
}