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

时间:2009-02-22 03:45:44

标签: c++ visual-studio file

首先,我要确定我的文件夹目录中有文本文件。我使用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中编译这个问题

7 个答案:

答案 0 :(得分:13)

您有几个选择:

  1. 你试过的那个 - 打开文件。
  2. 使用stat
  3. 使用GetFileAttributes
  4. 使用FindFirstFile
  5. 确保其存在并且您可以使用的唯一方法是打开它。如果您使用其他方法,最终会出现竞争条件(因为在您检查文件是否存在后,该文件可能会被删除或锁定。

    编辑:您的代码中还有其他一些问题。首先,您通过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()之前被删除,则代码将变得非常混乱。