2017-10-27 14 views
0

私はちょうど始めたので、私はまだCの初心者です。ここでは、ファイルを開いてファイル行を変数に保存する私の関数の一部です。ファイルの最後までループしていたので、最後の行を得ることができましたが、期待通りには行かなかったのです。だから、私はテキストファイルから最後の行を得るにはどうすればいいのだろうか?ありがとうございました。テキストファイルの最後の行を読む - Cプログラミング

tfptr = fopen("trans.txt", "r"); 
    while (!feof(tfptr)){    
      fscanf(tfptr, "%u:%u:%.2f\n", &combo_trans, &ala_trans, &grand_total);            
    } 
    fclose(tfptr); 

サンプルテキストファイル:

0:1:7.98 
1:1:20.97 
2:1:35.96 
2:2:44.95 
2:2:44.95 
3:2:55.94 
+4

[常に間違っている「(!feofを(ファイル))しながら、」なぜ?](https://stackoverflow.com/questions/5431941/why-is-while-feof-file-alwaysの可能性のある重複-wrong) –

答えて

0

fscanf(tfptr, "%u:%u:%.2f\n", &combo_trans, &ala_trans, &grand_total);には、%.2fが問題になります。

printf()の場合のように、浮動小数点数の精度をscanf()に指定することはできません。答えはthisです。

したがって、scanfフォーマット文字列の%.2fの代わりに、%fを使用してください。

最後の行が必要なだけなので、ファイルを行ごとにfgets()と読んで、最後の行を残すことができます。

while(fgets(str, sizeof(str), tfptr)!=NULL); 
printf("\nLast line: %s", str); 

fgets()ファイルが終わったときNULLを返します(または読み込み中に何らかのエラーが発生した場合)します。

入力ファイルの行が1つずつ読み込まれ、読み取る行がもうない場合、str(適切なサイズの文字配列)に最後に読み込まれた行があります。あなたは、その後も

sscanf(str, "%u:%u:%f", &combo_trans, &ala_trans, &grand_total); 

ようsscanf()strに文字列を解析でき

、あなたは、ファイルが実際に開かれたかどうかを確認するためにfopen()の戻り値をチェックする必要があります。エラーが発生した場合、fopen()NULLを返します。

if((tfptr = fopen("trans.txt", "r"))==NULL) 
{ 
    perrror("Error"); 
} 
+0

コーナーケース: "' 'str'は最後に読み込まれた行を持ちます。 2つのケースで失敗します: "読み込み中に何らかのエラーが発生した場合"(まれです)、 'str'の内容は不定です。これまでに行が読み込まれなかった場合、 'str'は初期化されていない可能性があります。 – chux

0

間違って行くのですか?あなたは別の行を得ましたか?

ポインタを保存しないように「&」は使用しないでください。それが失敗の原因になる可能性があります。

+0

'scanf'は引数としてポインタを必要としますが、それらを省略することはオプションではありません(それらの変数がポインタではないと仮定します)。 – bta

関連する問題