2009-05-13 4 views
2

FILE * Fが_sfopen()で使用されていますwhile(!feof(f))そしてfgets(str、1024、f)が実行中に最後の行に到達すると、それはまだwhileに入りますが、fgetsを試みるとアクセス違反のarrorで飛びます(menuses while try and catch(...)私はそれが良い解決策ではないことを知っています)私は問題を解決するために何を変えるのですか?fgets()を使用してファイルから読み取ると、「アドレスから読み取るアクセス違反...」が発生するC++

プラス - 1行ずつ読みたい場合は、1024のサイズを指定するだけです。失敗する可能性があります - 行の途中から毎回読み込むサイズのためにファイルがあります次の行の途中に - 私のファイルがどのように見えるかわからないので、行を読む良い方法がありますか?(最後に\ nがある場合など)

ありがとう!

+6

ご使用のコードをご記入ください。 –

+0

std :: ifstreamの代わりにFILEを使用する特別な理由はありますか? – Jem

+0

char buf [1024]、* p; while(fgets(buf、sizeof(buf)、fp)!= NULL){ do something ... } – sofr

答えて

0

タグとしてC++を指定しました。ファイルからの入力にはファイルストリーム(std :: ifstream)を使用し、行ごとに取得してそれをstd :: stringに入れて解析/操作するためのグローバルなgetline()関数を使用しました。例えば

here(「テキストファイル」段落の第二の例を)見て

0

here - 特に「警告」セクションをご覧ください。

3

あなたはEOFフラグが後まで設定されませんので、それが壊れている、その後while(!feof(f))前に読んでいない場合読まれました。代わりに、次のようなことをしてください:

char buf[1024]; 
while(fgets(buf, sizeof(buf), f)) { 
    /* process the line */ 
} 

fgetsは読み込み失敗またはEOFのいずれかでNULLを返すように定義されているためです。

これをC++で行っている場合は、同様のパターンを使用することをお勧めします(ただし、代わりにC++のiostreamsを使用します)。

std::ifstream file("filename.txt"); 
std::string line; 
while(std::getline(file, line)) { 
    // process the line 
} 
関連する問題