2012-01-13 9 views
0

私はCで書かれたプログラムに問題があります。+ + C:Bを使ってウィンドウ7で。ここでは、ファイル内の行数を調べるために使用しているコードを示します。最初の部分は、gotoline関数の宣言であり、その後にファイルの行数を数えるコードの部分が続きます。ロギングプロセスを追加するまでは、すべてうまくいきました。たぶん私は間違った情報を記録しているか、1つの関数の中であまりに多くのファイルを開いたり閉じたりして作業していますか?私のエラーを特定するための助けがあれば、大いに感謝しています。私は、私の問題についてさらに詳細な説明や説明をしてくれることを嬉しく思います。私はまだC++を勉強しているので、私のプログラムが行を数えなくなったのはなぜか私はちょっと混乱しています。ファイルの詳細をログに記録してから何が起こったのですか?

std::ifstream& GotoLine(std::ifstream& file, unsigned int num) 
{ 
file.seekg(std::ios::beg); 
for(int i=0; i < num - 1; ++i) 
{ 
    file.ignore(std::numeric_limits<std::streamsize>::max(),'\n'); 
} 
return file; 
} 


ifstream productguide; 

    productguide.open ("MasterProductGuide.csv"); 

    if (productguide.good()) 
    { 

     c = productguide.get(); 
     if (c=='\n')x++; 

     ofstream log; 
     log.open ("log.txt", ofstream::app); 

     if (log.good()) 
     { 
      time_t rawtime; 
      struct tm * timeinfo; 
      time (&rawtime); 
      timeinfo = localtime (&rawtime); 
      string loginfo; 
      loginfo = asctime (timeinfo); 
      log << "MarketManager Detected " << x << " # of lines in the Master Product Guide - " + loginfo; 
     } 
     else 
     { 
      cout << "There was an error creating the log file" << endl; 
      cout << "The Program will now terminate" << endl; 
      system("PAUSE"); 
      return 0; 
     } 
     log.close(); 

    } 
    else 
    { 
     ofstream log; 
     log.open ("log.txt", ofstream::app); 

     if (log.good()) 
     { 
      time_t rawtime; 
      struct tm * timeinfo; 
      time (&rawtime); 
      timeinfo = localtime (&rawtime); 
      string loginfo; 
      loginfo = asctime (timeinfo); 
      log << "MarketManager Failed to oped the Master Product Guide - " + loginfo; 
     } 
     else 
     { 
      cout << "There was an error creating the log file" << endl; 
      cout << "The Program will now terminate" << endl; 
      system("PAUSE"); 
      return 0; 
     } 
     log.close(); 

     cout << "The Program will now terminate" << endl; 
     system("PAUSE"); 
     return 0; 
    } 

    productguide.close(); 
+0

を返すべきです。このソースファイルのフルバージョンを投稿できますか? –

+0

私は読みやすさのために物事を壊す方法のためにそのほぼ1000行。投稿せずに送信する方がいいですか? – Rob

+2

この2つのコードは私のために見えます。だから私は問題が別の場所にあると思う。 –

答えて

0

このコードを見ると、ログが添付されたままになっています。結局、それはかなり大きくなるでしょう。

私はこのコードが失敗する別の理由はないとは言えませんが、確かに2GB以上のファイルがあります。となります。私は追記モードにこれに問題があるのを思い出しませんが、内部的にはシークを使用するかもしれません。シークには大きなファイルには問題があります。 Linuxではfseek64ファミリの関数を使用します。 Windowsには、非互換性のためにアンダースコアの疣贅を持つ独自のバージョンがあります。

ストリームで作業しているときは、エラーフラグもチェックする必要があります。実際にストリームが間違っている場合は、実際にはスローされません。開いた後でチェックしますが、他の操作も失敗する可能性があります。

具体的には、std::istream::ignoreを呼び出します。 GotoLineはeofをチェックしません。デザインの観点からは、私はそれをかなり疑っています。それはうまくいくかもしれませんが、確かにコードレビューに合格すべきではありません。 nitpickとして

、エラーがstd::cerrに印刷されたと私は何も理解していない1. :)