2016-12-15 3 views
1

ここに「非効率的な」コードがたくさんあると確信していますが、私はちょうど学んでいます。outfileエラーへの読み書き(おそらく単純な修正)

私は(以前のハイスコアを表示したときに、私はここに持ってる問題は、次の形式で「Score.txt」に保存されている

NAME 
score right wrong 

だから、それは次のようになります。

Bob 
40 2 2 

以前のハイスコア情報(Score = 40、Right = 2、Wrong = 2)を表示する代わりに、-80883004などの数字が表示されます。

誰でも次のコードからこの原因が考えられますか?

void Score(int score, string name, int qRight, int qWrong) 
{ 
    infile.open("Score.txt"); 

    string nameHS; 
    int scoreHS, rightHS, wrongHS; 
    char choice; 

    getline(infile, nameHS); 
    infile >> scoreHS; 
    infile >> rightHS; 
    infile >> wrongHS; 

    system("CLS"); 

    cout << "You have completed Trivia!\n\n"; 
    cout << setw(30) << "Your Score " << setw(30) << "High Score " << '\n'; 
    cout << setw(30) << "--------------" << setw(30) << "--------------" << '\n'; 
    cout << setw(25) << "| Score: " << setw(3) << score << " |" 
     << setw(25) << "| Score: " << setw(3) << scoreHS << " |" << '\n'; 
    cout << setw(25) << "| Right: " << setw(3) << qRight << " |" 
     << setw(25) << "| Right: " << setw(3) << rightHS << " |" << '\n'; 
    cout << setw(25) << "| Wrong: " << setw(3) << qWrong << " |" 
     << setw(25) << "| Wrong: " << setw(3) << wrongHS << " |" << '\n'; 
    cout << setw(30) << "--------------" << setw(30) << "--------------" << "\n\n"; 

    if (score > scoreHS) 
    { 
     cout << "Congratulations! You beat the high score!\n\n"; 
     cout << "Would you like to save your score?\n"; 
     cout << "(Y/N): "; 
     cin >> choice; 

     if (choice == 'y' || choice == 'Y') 
      saveScore(score, name, qRight, qWrong); 
     else if (choice == 'n' | choice == 'N') 
      cout << "\nPlay again soon!\n\n"; 
     else 
      cout << "Invalid option... game save incomplete! Good-Bye!\n\n"; 
    } 
    outfile.close(); 
} 

void saveScore(int score, string name, int qRight, int qWrong) 
{ 
    system("CLS"); 

    cout << "Your HIGH SCORE has been saved!\n"; 
    cout << "Good luck next game ....\n\n"; 

    outfile.open("Score.txt", ofstream::out | ofstream::trunc); 

    outfile << name << '\n'; 
    outfile << score << ' ' << qRight << ' ' << qWrong << '\n'; 

    outfile.close(); 
} 
+0

IOが間違っている(またはそれが起こる前に)ときは、任意のオープンまたは読み取り機能の結果を制御するのがよいでしょう。なぜ、getlineとstream extractorsを混在させるのですか? –

+0

何が良い選択肢でしょうか?私はこれを初めて知っていることを覚えておいてください...私は、ストリーム抽出プログラムが何であるか完全にはわかりませんか?あなたはgetl​​ineとinfile >>を一緒にすることを指していますか? – Brice

答えて

1

入力ファイルが開かれていないと思われます。 infileを開いたら、次のチェックを追加します。

bool bIsOpen = infile.is_open(); 

bIsOpenがtrueであることを確認してください。 falseに設定されている場合は、おそらく入力ファイルを別のディレクトリに配置する必要があります。 Visual Studioを使用している場合は、作業ディレクトリを確認してそこにファイルを置きます。

+0

infileが開かれていることを確認するためのチェックを追加しました。それで問題が何であるかは不明です。 – Brice

+0

あなたのコードは自分のコンピュータ上で動作します。私はVisual Studio 2015を使用しています。あなたの開発環境とは何ですか?多分あなたの入力ファイルに何か問題がありますか? – zooropa

+0

これは奇妙なことですが、VS 2015も使用しています。そして、私は入力ファイルに間違ったものを見つけることができません。私は手動でそれを入力して、それをフォーマットし、使用されたデータで置き換えるために私の出力に頼った.....あなたは文字通り自分のコードをコピー/ペーストしてうまくいきましたか? – Brice

0

問題が解決しました。私は開いているファイルの以前のすべてのインスタンスを閉じるのを忘れていました。何とかエラーが発生している必要があります。助けてくれたおかげで!

+0

私にいくつかの愛を与えて、私のポストに投票してください。私はあなたの入力ファイルに何かがあることを正しい方向に向かわせました。私はあなたが物事を働いているのを見てうれしいです。がんばろう! – zooropa

+0

私はあなたを持っています!ヘルプマンに感謝します。とても有難い。 – Brice

関連する問題