2016-11-13 9 views
3

私はプログラミングの原則1クラスの課題に取り組んでいる新入生のコンピュータサイエンスです。その一部には、ファイルがすでに存在する場合にファイルを上書きするかどうかをユーザーに尋ねることが含まれます。私はCode :: Blocksを使用しています。私が最初のプログラミングクラスでしかないことに留意してください。ここで私は、このために書いたコードは次のとおりです。C++プログラミング:すでにファイルが存在する場合にファイルを上書きするかどうかをユーザーに問い合わせ

#include <iostream> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char outputFileName[81]; 
    ifstream tempInputFile; // to check if file already exists 
    char overwrite; 
    ofstream outputFile; 

    system("cls"); 
    cout << endl << endl; 

    cout << "Please enter the file for data to be written to: "; 
    cin >> outputFileName; 
    cout << endl << endl; 
    tempInputFile.open(outputFileName); 
    while (tempInputFile) 
    { 
     cout << "This file already exists. Would you like to overwrite? (Y/N):"; 
     cin >> overwrite; 
     cout << endl << endl; 
     if (overwrite == 'Y' || overwrite == 'y') 
     tempInputFile.close(); 
      // I also tried a block if statement here with .clear() before the .close() 
     else 
     { 
     tempInputFile.close(); 
     cout << "Please enter the file for data to be written to: "; 
     cin >> outputFileName; 
     cout << endl << endl; 
     tempInputFile.open(outputFileName); 
     } // end else 
    } // end while 

    tempInputFile.close(); 
    outputFile.open(outputFileName); 

    cout << "The file is ready to be written to..." << endl << endl; 

    cout << endl << endl; 
    system("pause"); 
    return 0; 
} // end main() 

問題は、既存のファイルが入力された場合、ユーザーはファイルを上書きする「Y」と応答している彼らは上書きする場合、プログラムは再び尋ねますファイル。 2回目は "Y"に答える必要がありますが、なぜ2回目に尋ねるのか分かりません。私は最終的に正しく(do ... whileループを使用して)それを処理するいくつかのコードを書きましたが、なぜ他のコードが私がそれを行うべきだと思っていないのかを知りたいのです。誰かがこれを私に説明してもらえますか?

#include <iostream> 
#include <cstdlib> 
#include <fstream> 

using namespace std; 

int main() 
{ 
    char outputFileName[81]; 
    ifstream tempInputFile; 
    char overwrite; 
    ofstream outputFile; 

    system("cls"); 
    cout << endl << endl; 

    cout << "Please enter the file for data to be written to: "; 
    cin >> outputFileName; 
    cout << endl << endl; 

    tempInputFile.open(outputFileName); 
    if (tempInputFile) 
     do 
     { 
     cout << "This file already exists. Would you like to overwrite? (Y/N):"; 
     cin >> overwrite; 
     cout << endl << endl; 
     if (overwrite == 'N' || overwrite == 'n') 
     { 
      tempInputFile.close(); 
      cout << "Please enter the file for data to be written to: "; 
      cin >> outputFileName; 
      cout << endl << endl; 
      tempInputFile.open(outputFileName); 
      if (!tempInputFile) 
       overwrite = 'Y'; 
     } // end if 
     } while (overwrite == 'N' || overwrite == 'n'); 

    cout << "The file is ready to be written to..." << endl << endl; 

    tempInputFile.close(); 
    outputFile.open(outputFileName); 

    cout << endl << endl; 
    system("pause"); 
    return 0; 
} // end main() 

答えて

3

レッツ・フォーカス:

whileが、彼はファイルを上書きしたい(複数可)あれば、答えは Yある場合は、ユーザーに尋ねる成功 open後初めて呼び出され
tempInputFile.open(outputFileName); 
while (tempInputFile) 
{ 
    cout << "This file already exists. Would you like to overwrite? (Y/N):"; 
    cin >> overwrite; 
    cout << endl << endl; 
    if (overwrite == 'Y' || overwrite == 'y') 
    tempInputFile.close();  
    else 
    { 
     // not important 
    } // end else 
} // end while 

ファイルを閉じ、whileループチェック条件を再度実行します。

問題はwhile (tempInputFile)の式がある場合はerrorsがあるかどうかをチェックすることです。ファイルを通常閉じると問題は発生しないので、条件はtrueで、whileの本文をもう一度入力します。次に、ファイルをもう一度閉じようとします。ここでは、ファイルが既に閉じられているために失敗します。したがって、while (tempInputFile)が3回目に呼び出されると、falseで終了します。

+0

はい、わかりました。どうもありがとうございました! – dsfsu

1

は、ループの最初の部分でbreak文を入れて:ここで私はそれは私が欲しいものをやっている書いたコードです。 tempinputfile.close()を実行しても、私の推測では、whileループに関する限り、それはまだ真の価値です。

だから、このようになり、編集:

cin >> overwrite; 
cout << endl << endl; 
if (overwrite == 'Y' || overwrite == 'y') 
{ 
tempInputFile.close(); 
break; 
} 

動作する必要があることを!ブレークはすぐにwhileループを終了し、上書きすることができます。 は、elseステートメントの下に改行を入れます。この場合、ループを再度実行したいからです。

乾杯!あなたのコードのこの部分に

関連する問題