首先,我要确定我的文件夹目录中有文本文件。我使用visual studio,这是我的源代码编译的地方。
下面的代码应该说明它无效的原因。在视觉工作室。
int main( const int argc, const char **argv )
{
char usrMenuOption;
const char *cFileName = argv[ 1 ];
checkName( cFileName ); // supplying the checkName function with contents of argv[1]
usrMenuOption = getUsrOption(); // calling another function
fgetc(stdin);
return 0;
}
ifstream *openInputFile( const char *cFileName )
{
// this function might be the pronblem.
ifstream *inFile;
inFile = new ifstream;
inFile->open( cFileName, ios::in );
return inFile;
}
bool checkName( const char *cFileName )
{
// it works fine if i use a regular ifstream obj and not the one from the function
ifstream *inFile;
inFile = openInputFile( cFileName );
inFile->open( cFileName, ios::in );
if ( inFile->good() )
{
return true;
}
else
{
cout << '"' << cFileName << '"' << ": File does not exist! " << endl;
return false;
}
}
如果我为ifstream使用非指针对象,它确实有效。 但是我需要使用我所做的功能以这种方式打开我的所有输入文件。 我有点困惑,因为我没有在dev-cpp中编译这个问题
答案 0 :(得分:13)
您有几个选择:
确保其存在并且您可以使用的唯一方法是打开它。如果您使用其他方法,最终会出现竞争条件(因为在您检查文件是否存在后,该文件可能会被删除或锁定。
编辑:您的代码中还有其他一些问题。首先,您通过infile
分配new
,但您永远不会delete
。其次,您拨打open
两次。
答案 1 :(得分:3)
这是测试存在的一种不好的方法:因为如果文件被另一个进程打开,那么该文件存在但你无法打开它。
更好的测试方法可能是使用GetFileAttributes Function:如果它没有返回INVALID_FILE_ATTRIBUTES
,那么该文件就存在。
答案 2 :(得分:3)
如果你不介意使用Boost,我猜有一个简单的函数boost :: filesystem :: exists(path)对你有用!
答案 3 :(得分:2)
我总是检查ifs.is_open(),其中ifs是ifstream。
答案 4 :(得分:1)
检查是否存在文件(符合POSIX.1):
#include <unistd.h>
if (! access (file_name, F_OK))
{
// File exists.
}
答案 5 :(得分:1)
How do i check if a file exists using ANSI C++?
#include <fstream>
inline bool FileExists(const char * filename)
{
return std::ifstream(filename);
}
答案 6 :(得分:1)
你试图在checkName()
内打开文件两次:第一次在构造函数中调用openInputFile()
,第二次调用checkName()
本身。为什么第二次拨打open()
?
我不知道当一个已打开文件的ifstream
尝试open()
另一个文件时会发生什么,但它不会很好,而且很可能取决于确切的库实现(因此Dev-C ++和MSVC ++之间的不同行为)。简而言之,不要这样做。
至少还有一个其他错误:你没有在inFile
内的任何地方关闭checkName()
。
真的,最好不要单独使用checkName()
函数 - 只需要openInputFile()
尝试打开文件,如果失败,请在那里报告错误和/或返回{{ 1}}指针(甚至抛出异常)。这样,操作就是“原子” - 就目前而言,如果文件在调用时NULL
存在但在后续调用checkName()
之前被删除,则代码将变得非常混乱。