2016-11-13 94 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」覆蓋文件,程序會再次,如果他們想覆蓋問文件。第二次回答「Y」會繼續,但我不明白爲什麼第二次問。我終於編寫了一些能正確處理它的代碼(使用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

讓我們專注於您的這部分代碼:

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被稱爲成功open後第一次你問用戶,如果他(她)要覆蓋文件,如果答案是Y你關閉該文件並再次檢查環路條件while

問題是while (tempInputFile)表達式檢查是否有任何errors。由於通常關閉文件不會導致任何問題,因此條件爲true,並且您再次輸入while的正文。然後,您嘗試再次關閉文件,這是因文件已關閉而失敗的地方。所以當第三次調用while (tempInputFile)時,它會以錯誤退出。

+0

是的,我現在明白了。非常感謝你! – dsfsu

1

把一個break聲明在循環的第一部分。雖然你做tempinputfile.close()我的猜測是,它仍然是一個真正的價值,就while循環而言。

所以編輯是這樣的:

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

這應該工作!休息會立即退出while循環並允許您覆蓋。如果不是else語句下放了一個斷點,因爲在那種情況下,您希望循環再次執行。

乾杯!

相關問題