尝试打开不存在的文件会阻止后续在 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 会导致另一个线程阻止打开常规文件