Этот вопрос уже имеет ответ здесь:
Есть ли простой способ проверить, пуст ли файл. Как то, если Вы передаете файл функции, и Вы понимаете, что это пусто, тогда Вы закрываете его сразу же? Спасибо.
Редактирование, я пытался использовать fseek метод, но я добираюсь, ошибка при высказывании 'не может преобразовать ifstream в ФАЙЛ *'.
Параметр моей функции
myFunction(ifstream &inFile)
Возможно, что-то вроде:
bool is_empty(std::ifstream& pFile)
{
return pFile.peek() == std::ifstream::traits_type::eof();
}
Коротко и ясно.
Что касается вашей ошибки, другие ответы используют доступ к файлам в стиле C, где вы получаете FILE*
с определенными функциями.
В противоположность этому, мы с вами работаем с потоками C++, и как таковые не можем использовать эти функции. Приведенный выше код работает простым образом: peek()
заглядывает в поток и возвращает, не удаляя, следующий символ. Если он достигнет конца файла, то вернется eof()
. Следовательно, мы просто peek()
в потоке и смотрим, есть ли eof()
, так как в пустом файле нечего искать.
Обратите внимание, что это также возвращает true, если файл вообще не открывался, что должно сработать в вашем случае. Если вы не хотите этого, то:
std::ifstream file("filename");
if (!file)
{
// file is not open
}
if (is_empty(file))
{
// file is empty
}
// file is open and not empty
Итак, эта часть кода должна сработать для вас. Я изменил имена, чтобы они соответствовали вашему параметру.
inFile.seekg(0, ios::end);
if (inFile.tellg() == 0) {
// ...do something with empty file...
}
Перейдите в конец файла и проверьте позицию:
fseek(fileDescriptor, 0, SEEK_END);
if (ftell(fileDescriptor) == 0) {
// file is empty...
} else {
// file is not empty, go back to the beginning:
fseek(fileDescriptor, 0, SEEK_SET);
}
Если у вас еще нет открытого файла, просто используйте функцию fstat
и напрямую проверьте размер файла.
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
fseek(pFile, 0, SEEK_SET);
do something...
}
fclose(pFile)