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++ 的问题,或者可能是软件可移植性的问题。

有什么帮助吗?非常感谢!Giancarlo Perlo - 意大利

4

2 回答 2

0

打开失败设置“失败”位。这些位永远不会(!)自动重置,您必须使用手动重置它们clear()。这有点违反直觉,因为打开一个新文件应该删除任何早期的历史记录,但它在整个 IOStream API 中是一致的。

为了解决这个问题,我会将 fstream 移动到循环中,因此每个文件都会使用新的 fstream 实例打开。通常,您应该将变量的声明尽可能地靠近它们的用途。例如,int fflag;应该是bool successful_read = false;在循环之前声明的 , 。这使它更清楚它是如何使用的。OTOH,您也可以简单地使用一个无限循环,只有break在成功读取文件后才能使用该循环。此外,我会使用 astd::string作为名称,然后使用它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 回答