Проверка существования txt-файла с кодом C ++ - PullRequest
3 голосов
/ 22 февраля 2009

Прежде всего, я хотел бы убедиться, что у меня есть текстовый файл в моем каталоге папок. Я использую 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 ]

13 голосов
/ 22 февраля 2009

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

  1. Тот, который вы пробовали - открытие файла.
  2. Использование stat .
  3. Использование GetFileAttributes .
  4. Использование FindFirstFile .

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

РЕДАКТИРОВАТЬ : у вас есть несколько других проблем в вашем коде. Во-первых, вы выделяете infile через new, но вы никогда не delete его. Во-вторых, вы звоните open дважды.

3 голосов
/ 22 февраля 2009

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

3 голосов
/ 22 февраля 2009

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

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

2 голосов
/ 22 февраля 2009

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

1 голос
/ 22 февраля 2009

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

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

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

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

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

1 голос
/ 22 февраля 2009

Как проверить, существует ли файл с использованием ANSI C ++?

#include <fstream>

inline bool FileExists(const char * filename)
{
    return std::ifstream(filename);
}
1 голос
/ 22 февраля 2009

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

#include <unistd.h>

if (! access (file_name, F_OK))
{
  // File exists.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...