0

私は学校の課題の最初の部分を開始しており、ユーザーにファイル名を入力するように促し、ファイルの存在を確認し、存在する場合はそれを開いて処理する必要があります。それ以外の場合は、ユーザーに別のファイル名を入力してもらいます。

以下のプログラムをコンパイルして実行すると、「ファイルが存在しません。別のファイル名を入力してください」というエラー メッセージが表示されます。存在しないファイルの名前を入力すると、do while ループの最初の部分が再び実行されます。私は C++ の初心者ですが、以前にこれを行ったことがあり、適切に動作するはずだと感じています。どんな助けでも大歓迎です。

#include <iostream>
#include <string>
#include <fstream>
using namespace std;

struct customerData
{ 
  int _customerID;
  string _firstName, _lastName;
  double _payment1, _payment2, _payment3;
};

void processFile();

int main()
{
  processFile();

  system ("pause");
  return 0;
}

void processFile()
{
  string filename;
  ifstream recordFile;

 do
 {
    cout << "Please enter a filename\n";
    cin >> filename;
    recordFile.open(filename);
    if (recordFile.good())
    // {
    //  enter code for if file exists here
    // }
    ;
 }
 while(recordFile.fail());
 {
        cout << "No file by that name. Please enter another filename\n";
        cin >> filename;
        recordFile.open(filename);
 }
}
4

3 に答える 3

2

ファイルが正常に開かれたかどうかを確認するには、次のように std::fstream::is_open() 関数を使用する必要があります。

void processfile ()
{
  string filename;

  cout << "Please enter filename: ";
  if (! (cin >> filename))
    return;

  ifstream file(filename.c_str());
  if (!file.is_open())
  {
    cerr << "Cannot open file: " << filename << endl;
    return;
  }

  // do something with open file
}

メンバー関数 .good() および .fail() は、ファイルが正常に開かれたかどうかではなく、他の何かをチェックします。

于 2012-10-04T16:34:04.953 に答える
1

ここであなたの意図が何なのかは 100% わかりませんが、ループが 1 つしかないことがわかりますか? do/while ループの後、中かっこで囲まれたコードがいくつかありますが、それはどのループ構成にも接続されていません...それは単に新しいスコープです (ここでは目的を果たしません)。

したがって、あなたのプログラムはこれを行います:

1) ファイル名を尋ねます。開いてみてください。ファイル ストリームが読み取れる場合は、「ここにコードを入力」の部分を実行します。

2) ファイルストリームが「不良」かどうかを確認します。そうである場合は、ステップ 1 に戻ります。そうでない場合は、続行します。

3)「その名前のファイルはありません」と出力し、新しいファイルの入力を求め、それを開こうとします

それはほぼ確実にあなたが望むものではありません。

于 2012-10-04T16:35:18.193 に答える
1

Cコードを使用できます。

FILE *fp = fopen("file" "r");
if(fp){
//do stuff
}
else{
//it doesnt exist
}

ちなみに、名前空間 std を使用する場合は、グローバルにならないようにしてください

必要に応じて、代わりに関数内に配置できます

int main(){
using namespace std;
//other std stuff
}
于 2012-10-04T16:35:45.617 に答える