Ответ 1
Я всегда проверяю ifs.is_open(), где ifs является ifstream.
Прежде всего, я бы установил, что у меня есть текстовый файл в папке 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
Я всегда проверяю ifs.is_open(), где ifs является ifstream.
У вас есть несколько вариантов:
Единственный способ гарантировать, что он существует и что вы можете его использовать, - это открыть его. Если вы используете другие методы, вы получаете условие гонки (потому что файл можно удалить или заблокировать после проверки, чтобы увидеть, существует ли он.
EDIT. У вас есть еще пара проблем в коде. Во-первых, вы выделяете infile
через new
, но вы никогда не delete
его. Во-вторых, вы дважды вызываете open
.
Это плохой способ проверить существование: потому что, если файл открыт другим процессом, файл существует, но вы не можете его открыть.
Лучшим способом тестирования может быть использование Функция GetFileAttributes: если он не возвращает INVALID_FILE_ATTRIBUTES
, тогда файл существует.
Если вы не против использования Boost, есть простая функция boost:: filesystem:: exists (path), которая была бы полезной для вас, я думаю!
Чтобы проверить наличие файла (совместимый с POSIX.1):
#include <unistd.h>
if (! access (file_name, F_OK))
{
// File exists.
}
Как проверить, существует ли файл с использованием ANSI С++?
#include <fstream>
inline bool FileExists(const char * filename)
{
return std::ifstream(filename);
}
Вы пытаетесь открыть файл дважды внутри checkName()
: первый раз в вызове конструктора внутри вызова openInputFile()
, второй раз внутри checkName()
. Почему второй вызов open()
?
Я не знаю, что произойдет, когда ifstream
с уже открытым файлом попытается выполнить open()
другой файл, но это будет нехорошо, и это может сильно зависеть от точной реализации библиотеки (следовательно, различное поведение между Dev-С++ и MSVС++). Короче говоря, не делать этого.
Есть, по крайней мере, еще одна ошибка: вы не закрываете inFile
где-либо внутри checkName()
.
Действительно, лучше не иметь отдельную функцию checkName()
- просто попробуйте openInputFile()
открыть файл, и если он не сработает, сообщите об ошибке прямо там и/или верните указатель NULL
(или даже выбросить исключение). Таким образом, операция является "атомарной" - по мере того, как это происходит, если файл существует во время вызова checkName()
, но удаляется перед последующим вызовом openInputFile()
, ваш код будет очень запутан.