Проверка существования txt файла с кодом С++

Прежде всего, я бы установил, что у меня есть текстовый файл в папке Folders. Я использую визуальную студию, и именно там компилируется мой исходный код.

В приведенном ниже коде должно быть указано, почему он не работает. В визуальной студии.

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;
    }         
}

Это работает, если я использую объект non-pointer для ifstream. однако мне нужно открыть все мои входные файлы таким образом, используя созданную мной функцию. Я немного смущен, потому что у меня не было этой компиляции проблемы в dev-cpp

Ответ 1

Я всегда проверяю ifs.is_open(), где ifs является ifstream.

Ответ 2

У вас есть несколько вариантов:

  • Тот, который вы пробовали - открытие файла.
  • Использование stat.
  • Используя GetFileAttributes.
  • Использование FindFirstFile.

Единственный способ гарантировать, что он существует и что вы можете его использовать, - это открыть его. Если вы используете другие методы, вы получаете условие гонки (потому что файл можно удалить или заблокировать после проверки, чтобы увидеть, существует ли он.

EDIT. У вас есть еще пара проблем в коде. Во-первых, вы выделяете infile через new, но вы никогда не delete его. Во-вторых, вы дважды вызываете open.

Ответ 3

Это плохой способ проверить существование: потому что, если файл открыт другим процессом, файл существует, но вы не можете его открыть.

Лучшим способом тестирования может быть использование Функция GetFileAttributes: если он не возвращает INVALID_FILE_ATTRIBUTES, тогда файл существует.

Ответ 4

Если вы не против использования Boost, есть простая функция boost:: filesystem:: exists (path), которая была бы полезной для вас, я думаю!

Ответ 5

Чтобы проверить наличие файла (совместимый с POSIX.1):

#include <unistd.h>

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

Ответ 7

Вы пытаетесь открыть файл дважды внутри checkName(): первый раз в вызове конструктора внутри вызова openInputFile(), второй раз внутри checkName(). Почему второй вызов open()?

Я не знаю, что произойдет, когда ifstream с уже открытым файлом попытается выполнить open() другой файл, но это будет нехорошо, и это может сильно зависеть от точной реализации библиотеки (следовательно, различное поведение между Dev-С++ и MSVС++). Короче говоря, не делать этого.

Есть, по крайней мере, еще одна ошибка: вы не закрываете inFile где-либо внутри checkName().

Но в любом случае, сделайте это вместо

Действительно, лучше не иметь отдельную функцию checkName() - просто попробуйте openInputFile() открыть файл, и если он не сработает, сообщите об ошибке прямо там и/или верните указатель NULL (или даже выбросить исключение). Таким образом, операция является "атомарной" - по мере того, как это происходит, если файл существует во время вызова checkName(), но удаляется перед последующим вызовом openInputFile(), ваш код будет очень запутан.