【问题标题】:Checking existence of a txt file with C++ code使用 C++ 代码检查 txt 文件是否存在
【发布时间】:2010-10-09 03:01:01
【问题描述】:

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

【问题讨论】:

  • 那么它到底有什么问题呢?如果它没有编译,编译器在哪里抱怨以及抱怨什么?如果它不运行,它在做什么意外?
  • 你的意思不是资源泄露? :)
  • 是的,除此之外,如果你不带参数启动它会崩溃......

标签: c++ visual-studio file


【解决方案1】:

这是一个糟糕的测试存在的方法:因为如果文件被另一个进程打开,那么文件存在但你不能打开它。

更好的测试方法可能是使用GetFileAttributes Function:如果它不返回INVALID_FILE_ATTRIBUTES,则该文件存在。

【讨论】:

    【解决方案2】:

    你有几个选择:

    1. 您尝试过的方法 - 打开文件。
    2. 使用stat
    3. 使用GetFileAttributes
    4. 使用FindFirstFile

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

    编辑:您的代码中还有一些其他问题。首先,你通过new 分配了一个infile,但你从来没有delete 它。其次,您拨打open 两次。

    【讨论】:

    • +1。只需尝试打开文件 - 这将工作或失败。甚至不用费心使用单独的 checkName() 函数,摆脱它。
    • @OJ 如果文件是打开的,是不是不能删除?
    【解决方案3】:

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

    #include <unistd.h>
    
    if (! access (file_name, F_OK))
    {
      // File exists.
    }
    

    【讨论】:

      【解决方案4】:

      How do i check if a file exists using ANSI C++?

      #include <fstream>
      
      inline bool FileExists(const char * filename)
      {
          return std::ifstream(filename);
      }
      

      【讨论】:

        【解决方案5】:

        您试图在checkName() 内打开文件两次:第一次是在对openInputFile() 的调用内的构造函数调用中,第二次是在checkName() 本身内。为什么第二次打电话给open()

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

        至少还有一个错误:您没有关闭 inFile 内的任何地方 checkName()

        但无论如何,请改为这样做

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

        【讨论】:

          【解决方案6】:

          如果你不介意使用 Boost,我猜有一个简单的函数 boost::filesystem::exists(path) 对你有用!

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2020-06-04
              • 1970-01-01
              • 1970-01-01
              • 2022-11-21
              • 2016-02-23
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多