尝试打开不存在的文件会阻止后续在 dev-C++ 中打开

Posted

技术标签:

【中文标题】尝试打开不存在的文件会阻止后续在 dev-C++ 中打开【英文标题】:Trying to open a file that doesn't exist prevents subsequent opening in dev-C++ 【发布时间】:2013-05-19 07:05:08 【问题描述】:

我正在尝试在 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 - 意大利

【问题讨论】:

我不能完全跟随你,但首先摆脱 dev-c++... 使用 g++ 或 VS 来自 MS,体面的环境。然后,memset 每次使用前你的名称文件。 在尝试使用相同的fstream 创建或重新打开该文件之前,您是否尝试过str.clear() 我无法重现您的问题,一切正常! (gcc) 对我来说也很好用(虽然不是 dev-c++) 【参考方案1】:

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

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

【讨论】:

非常感谢。我在关闭文件后使用 str.clear() 解决了。【参考方案2】:

这就是我检查文件是否无效的方式,只需添加您的代码块即可实现您想要做的事情。也用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();

【讨论】:

以上是关于尝试打开不存在的文件会阻止后续在 dev-C++ 中打开的主要内容,如果未能解决你的问题,请参考以下文章

Cygwin - 阻止打开命名的 fifo 会导致另一个线程阻止打开常规文件

WinInet 在 Windows 7 中不工作 - Dev-C++

如何在 Dev-C++ 中打开代码完成?

使用他们的包在 Dev-C++ 中安装 Allegro

Dev-C++ 不会使用资源文件

为啥我在 Dev-C++ 中看不到项目文件?