0

この非常に単純なコードを dev-C++ で実行しようとしています。

int fflag, num;
char nomefile[40];
fstream str;

fflag=0;
while (fflag==0)
      {
      cout<<"\nFile name? ";
      cin>>nomefile;
      str.open(nomefile,ios::in);

      //Checking if file exists
      if (str)
         {
         fflag=1;
         str>>num;             // Reading a value and sending it to standard output
         cout<<num<<"\n";
         }
      else
         {
         cout<<"\nFile doesn't exist! ";
         }

      }

既存のファイルを開こうとしても問題ありません。存在しないファイルを開こうとすると、エラー メッセージ (ファイルが存在しません) が表示されますが、その後既存のファイルを開こうとすると (つまり、同じループ内で)、同じエラー メッセージが生成されません。

存在しないファイルを検出した後、クローズ命令を追加しようとしましたが、問題は解決しません。理解できない!存在しないファイルを開こうとすると、ファイルが存在する場合でも、その後の再試行 (str.open を使用) で NULL ポインターが返されるようです。

同じコードが Code::Blocks で正しく実行されるため、dev-C++ に関する問題であるか、ソフトウェアの移植性の問題である可能性があります。

何か助けはありますか?どうもありがとう!ジャンカルロ・ペルロ - イタリア

4

2 に答える 2

0

オープンに失敗すると、「失敗」ビットが設定されます。これらのビットは自動的に (!) リセットされることはありません。 を使用して手動でリセットする必要がありますclear()。これは、新しいファイルを開くと以前の履歴が消去されるという事実を考慮すると、少し直感に反しますが、IOStream API 全体で一貫しています。

これを修正するには、fstream をループに移動して、各ファイルが新しい fstream インスタンスで開かれるようにします。一般に、変数の宣言は、変数の使用にできる限り近い場所に移動する必要があります。たとえば、 は、ループの直前に宣言されint fflag;た である必要があります。bool successful_read = false;これにより、使用方法が明確になります。OTOH、breakファイルを正常に読み取った後でのみ無限ループを使用することもできます。さらに、std::string名前に a を使用getline(std::cin, name)し、ファイル名を読み取るために使用します。

于 2013-05-19T07:34:20.927 に答える
0

これは、ファイルが無効かどうかを確認する方法であり、コードのブロックを追加して、目的を達成するだけです。また、g ++を使用してください。devは行くべき道ではありません!

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

int main()
{
    char fileName[50];
    ifstream str;
//get user input
    cout << "File Name?: ";
    cin >> fileName;
    cin.ignore(100,'\n');
//opens the file that the user entered
    read.open(fileName);
//check if file exists.
    if(!read)
    {
        cout << "File doesn't exist" <<endl;
    }
    else
    {
        //code here.
    }
//closes the file
    read.close();
}
于 2013-05-19T07:35:11.840 に答える