使用C++代码检查txt文件是否存在

3

首先,我想确认一下,我在文件夹目录中确实有文本文件。我正在使用Visual Studio,它是我的源代码编译的地方。

下面的代码应该说明为什么它不能在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 中编译时没有出现此问题。

那么它到底有什么问题呢?如果它不能编译,编译器在哪里抱怨,抱怨什么?如果它无法运行,它会出现什么意外情况? - sth
除了资源泄漏,你还有其他意思吗? :) - OJ.
是的,除此之外,如果你不带参数启动它,它就会崩溃... - sth
7个回答

13

你有几个选项:

  1. 已经尝试过的 - 打开文件。
  2. 使用 stat 函数。
  3. 使用 GetFileAttributes 函数。
  4. 使用 FindFirstFile 函数。

唯一可以保证文件存在且您可以使用它的方法是打开它。如果使用其他方法,您将面临竞争条件(因为在检查文件是否存在后,该文件可能被删除或锁定)。

编辑:你的代码中还有一些问题。首先,你通过 new 来分配一个 infile 对象,但是你没有通过 delete 来释放它。其次,你调用了两次 open 函数。


尝试打开文件,这样要么成功要么失败。甚至不需要使用单独的checkName()函数,将其删除即可。 - j_random_hacker
@OJ 如果文件处于打开状态,则无法删除吗? - John

3
那种测试文件是否存在的方法并不可靠:因为如果该文件已被其他进程打开,则文件存在但您无法打开它。
更好的测试方法可能是使用GetFileAttributes函数:如果它没有返回INVALID_FILE_ATTRIBUTES,则文件存在。

3
如果你不介意使用Boost库的话,那么有一个简单的函数boost::filesystem::exists(path)会对你很有用!

2
我总是检查 ifs.is_open(),其中 ifs 是一个 ifstream。

1

检查文件是否存在(符合POSIX.1标准):

#include <unistd.h>

if (! access (file_name, F_OK))
{
  // File exists.
}

1

1

你正在checkName()函数内部两次打开文件:第一次是在调用openInputFile()时的构造函数调用中,第二次是在checkName()函数本身内部。为什么要第二次调用open()呢?

我不知道当一个已经打开的ifstream尝试open()另一个文件时会发生什么,但这不会是好事,而且可能取决于确切的库实现(因此Dev-C++和MSVC++之间存在不同的行为)。简而言之,不要这样做

至少还有一个错误:你没有在checkName()函数内关闭inFile

但无论如何,请改成这样

实际上最好不要有单独的checkName()函数 - 只需让openInputFile()尝试打开文件,如果失败,请在那里报告错误和/或返回NULL指针(甚至抛出异常)。这样,操作是“原子性”的 - 就目前而言,如果在调用checkName()时文件存在,但在随后调用openInputFile()之前被删除,则您的代码将变得非常困惑。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接