Проверка пустой файл в C++ [дубликат]

Этот вопрос уже имеет ответ здесь:

Есть ли простой способ проверить, пуст ли файл. Как то, если Вы передаете файл функции, и Вы понимаете, что это пусто, тогда Вы закрываете его сразу же? Спасибо.

Редактирование, я пытался использовать fseek метод, но я добираюсь, ошибка при высказывании 'не может преобразовать ifstream в ФАЙЛ *'.

Параметр моей функции

myFunction(ifstream &inFile)
37
задан Crystal 6 March 2010 в 01:11
поделиться

4 ответа

Возможно, что-то вроде:

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
68
ответ дан 27 November 2019 в 04:27
поделиться

Итак, эта часть кода должна сработать для вас. Я изменил имена, чтобы они соответствовали вашему параметру.

inFile.seekg(0, ios::end);  
if (inFile.tellg() == 0) {    
  // ...do something with empty file...  
}
8
ответ дан 27 November 2019 в 04:27
поделиться

Перейдите в конец файла и проверьте позицию:

 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 и напрямую проверьте размер файла.

6
ответ дан 27 November 2019 в 04:27
поделиться
pFile = fopen("file", "r");
fseek (pFile, 0, SEEK_END);
size=ftell (pFile);
if (size) {
  fseek(pFile, 0, SEEK_SET);
  do something...
}

fclose(pFile)
0
ответ дан 27 November 2019 в 04:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: