2017-01-13 11 views
0

こんにちは、私はrpgゲームである学校プロジェクトに取り組んでいます。特定のファイルを通過するload_game関数を作成し、そのファイルにユーザーが入力したIDがあるかどうかを確認し、その特定の文字の統計をグローバル変数にロードします。 問題は、ユーザーがオプションを見ることができるようにファイルの内容を印刷する機能を作ったが、全く何も印刷しないということです。新しいプレーヤーで同じファイルを塗りつぶすnew_player関数を作成しました。ファイルを別のファイルに変更し、そのファイルに手動で書き込むと動作します。ここでは、コードは次のようになります。関数はC++でファイルの内容を読み込んで印刷しない

void load_game() 
{ 
    bool loading = true; 
    do{ 
     ifstream in_stream("Players.txt"); 
     ofstream out_stream("Players.txt"); 
     cout << "  The last son of Allheaven    " << endl; 
     cout << "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << endl; 
     char ch; 
     in_stream.clear(); 
     in_stream.seekg(0, in_stream.beg); 
     while (in_stream.get(ch)) 
     { 
      cout << ch; 
     } 
     cout << "   Enter -1 to return to main menu      " << endl; 
     cout << "+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+" << endl; 
     cout << endl << "Enter a number to access one of the above options: "; 
     in_stream.clear(); 
     in_stream.seekg(0, in_stream.beg); 
     int choice; 
     cin >> choice; 
     while (in_stream >> ID >> Name >> Class >> HP >> Mana >> ATK >> ability_dmg >> Defense >> magic_resist >> player_exp >> player_level) 
     { 
      if (choice == ID) 
      { 
       /*game_start();*/ 
       loading = false; 
       break; 
      } 
      else if (choice == -1) 
      { 
       system("cls"); 
       main_menu(); 
      } 
      else if (in_stream.eof()) 
      { 
       in_stream.clear(); 
       in_stream.seekg(0, in_stream.beg); 
       cout << endl << "Error! Invalid ID !" << endl; 

      } 
     } 
     in_stream.close(); 
     out_stream.close(); 
    } while (loading); 
} 

答えて

1

主要な問題は、あなたが二回同じファイルを開くということです。入力のために1回、および出力のために1回ファイルがあればそれを切り捨てます。したがって、out_streamを作成すると、ファイル内のすべてのデータが効果的に削除されます。

同じファイルを読み書きする場合は、std::iofstreamを使用して読み取り/書き込みモードで開きます。テキストファイルでは、ファイル内のデータを編集するのは難しいので、出力用の一時ファイルを開くことをお勧めします。完了したら、一時ファイルの名前を実際のファイルに変更します。

あなたの場合は、なぜ出力ファイルがあるのですか?あなたは実際にはそれをどこでも使用しないでください?それは、読みたいファイルを切り捨てるだけです。

+0

ありがとう、私はファイルを切り捨てることに気付かず、iofstreamで開くことができます。 –

+0

@AlemTuzlak同じ機能のファイルに*書き込み*する予定ですか?次に、最初に関数の名前が悪いので、どのようにファイルに書き込むべきか、どこでどこを書くべきかについて考えなければなりません。あなたが関数内のファイルに書き込むべきでないなら、単純な 'ifstream'を使います。 –

関連する問題