c++编程:询问用户是否想要覆盖一个已经存在的文件

C++ Programming: Asking user if they would like to overwrite a file if it already exists

本文关键字:一个 文件 存在 覆盖 编程 用户 是否 c++      更新时间:2023-10-16

我是一名计算机科学专业的大一学生,正在为我的编程原理1课做作业。其中一小部分涉及询问用户是否想要覆盖已经存在的文件。我正在使用Code::Blocks,请记住,我只是在我的第一堂编程课。下面是我为此编写的代码:

#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()

让我们专注于这部分代码:

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

whileopen成功后第一次被调用时,你问用户是否想覆盖文件,如果答案是Y,你关闭文件,while循环再次检查条件。

问题是while ( tempInputFile )表达式检查是否有任何错误。由于关闭文件通常不会引起任何问题,所以条件是true,您再次输入while的主体。然后您尝试再次关闭文件,这里是它失败的地方,因为文件已经关闭。因此,当while ( tempInputFile )第三次调用时,它以false退出。

break语句放在循环的第一部分。虽然你做了tempinputfile.close(),我的猜测是,就while循环而言,它仍然是一个真值。

那么编辑成这样:

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

应该可以!break将立即退出while循环并允许重写。而不是else语句下面放一个break,因为在这种情况下,您希望再次执行循环。

干杯!

相关文章: