2016-03-22 16 views
0

私は学校プロジェクト用の学生データベースシステムを作成しようとしています。学生IDの.txtファイルを検索し、文字列の他のすべての変数を返す関数を作成しようとしています。これはtxtファイルの最初の行にある学生のIDを検索しても別の行の学生を検索すると何もキャプチャしていない場合にはうまくいきます。私は明白な何かを欠いていますかC++の.txtファイルから複数の行を読み込む問題

生徒データは、各行にコンマで区切られた16文字列です。生徒IDが最初の文字列です。

ありがとうございました!

StudentType findStudent(int studentToFind) 
{ 
    ifstream inFile; 
    inFile.open("students.txt"); 

    string currentLine; 
    string dataRead[16]; 
    istringstream is; 
    int currentStudent; 

    if (inFile) 
    { 
     while (getline(inFile, currentLine)) 
     { 
      is.str(currentLine); 

      for (int i = 0; i < 16; i++) 
      { 
       getline(is, dataRead[i], ','); 
      } 

      currentStudent = stoi(dataRead[0]); 

      if (currentStudent == studentToFind) 
      { 
       /* 
       Do stuff here 
       */ 

       inFile.close(); 
       return foundStudent; 
      } 
      cin.ignore(); // Not sure if this is needed but I was trying to 
          // clear the \n char if that was causing the issue 
     } 
    } 
} 
+0

あなたの問題全体を投稿してください。あなたが持っている問題/質問に直接関係のないアイテムは削除してください。 このコードのちょうどNONEは重要です.... – UpAndAdam

+1

デバッガ(またはprintステートメント)を使用して、各ループ反復のcurrentStudentとstudentToFindの値を確認して、期待どおりのものであることを確認しましたか? – Tuffwer

+0

私はすべての値を割り当てた部分を削除しました。申し訳ありませんが、関数全体が役立つと思っていました。ブレークポイントを入れて、currentStudentの値が新しい行の値に決して割り当てられないように見えるので、次の行にまったく到達しないと仮定しています。 –

答えて

3

まず:あなたはcinを使用していないので、cin.ignore()を取り除きます。

2番目:あなたは常に最後にinfileを閉じるようにしてください...私は早期に戻ることも早く終了することも推奨しませんが、breakステートメントを使用してループを終了し、それかどうか。

第3回:私たちが最後に問題に取り組むことができるすべての「ゴープ」を取り除いたので...事実上問題はすべての行を読みますか?

よく確認してみてください。currentLineをwhileループの始めに印刷してみてください。currentLineが正しく更新されていれば、毎回isが更新されていますか?はい...

OK次回のループを見てみましょうcurrentStudentを毎回印刷しますか... currentStudentは各行に正しい値を出力しますか?つまり、getlineはdataRead[i]に書かれていて、それは正しい空間にあるべきだと思うものを実際に書いていますか?

まだ問題が見つかりましたか?

これは、印刷ステートメントとデバッガを使用して自分自身を解決する方法を学ぶために必要な種類の問題です。そのためのもの。ビジュアルスタジオでデバッグモードで実行している場合は、それを実行します。そうでなければ、gdbを使用します。それを学んでそれに慣れると、あなたはそれをたくさん使うでしょう!

幸運

+0

助けてくれてありがとう!私はis.clear()を追加して次のgetlineにループバックする前に、この動作を得ることができました。 .clear()の私の研究は、それがストリームにあるエラーを取り除くことです、なぜそれが最初にぶち壊されるのか何か手がかりですか?そのようなストリームをクリアするのがベストプラクティスであれば、どんな手がかりですか? –

+0

もう一度あなたの例を見て、あなたが間違っていることを理解するでしょう。正確にどの点でそれが動作していない..それはあなたがそれからすべてのデータを読み取った後に、ストリームオブジェクトを再利用できるように明確に発行する必要があります。 ベストプラクティスは、新しいオブジェクトを使用するか、またはクリアしてから再ロードすることです。 – UpAndAdam

関連する問題