С как проверить пустой ли файл

от admin

Проверка на пустой файл в C ++

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

Изменить, я пробовал использовать метод fseek, но я получаю сообщение об ошибке «Не могу преобразовать ifstream в FILE *».

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

7 ответов

Возможно, что-то похожее на:

Короткий и сладкий.

С учетом вашей ошибки другие ответы используют доступ к файлам в стиле C, где вы получаете FILE* с определенными функциями.

Напротив, мы с вами работаем с потоками С++ и поэтому не можем использовать эти функции. Вышеприведенный код работает простым способом: peek() заглянет в поток и вернет, не удаляя, следующий символ. Если он достигнет конца файла, он возвращает eof() . Ergo, мы просто peek() в потоке и видим, если он eof() , так как пустому файлу нечего заглядывать.

Примечание. Это также возвращает true, если файл никогда не открывается в первую очередь, что должно работать в вашем случае. Если вы этого не хотите:

Как проверить, пуст ли файл в C?

Я импортирую txtfile в свой файл, как проверить, является ли входной файл пустым.

Я уже проверяю, не может ли он прочитать ввод. Это то, что у меня есть до сих пор:

проверка размера, очевидно, не работает, потому что я помещаю несколько цифр, а размер по-прежнему равен 0. любые предложения?

Вызов ftell() не указывает размер файла. На странице руководства:

Функция ftell() получает текущее значение индикатора положения файла для потока, на который указывает поток.

То есть, он сообщает вам текущую позицию в файле. который всегда будет 0 для вновь открытого файла. Сначала вам нужно seek конец файла (см. fseek() ).

Вы можете использовать sys/stat.h и вызвать значение st_size struct st_size :

ftell сообщит вам позицию указателя файла, и сразу после открытия файла эта позиция всегда равна 0.

Вы либо используете stat перед открытием, либо используете fseek для поиска некоторого расстояния в файле (или в конце), а затем используйте ftell .

Или вы задерживаете чек до тех пор, пока это не произойдет. То есть, вы пытаетесь прочитать все, что вам нужно прочитать, а затем проверить, преуспели вы или нет.

Обновление: и если говорить о чеках, у вас нет гарантии, что

Для этого вам нужно проверить, что argc не менее 2 (первым аргументом является имя исполняемого файла). В противном случае имя вашего файла может быть NULL . fopen должен просто вернуть NULL , но в других сценариях вы можете посмотреть на дамп ядра.

Как я могу узнать, что текстовый файл пуст или нет? (На C)

Я пытаюсь определить, является ли текстовый файл пустым или нет в C. (значения инициализируются в NULL). Каждый раз при чтении первым значением (с использованием fscanf) он всегда возвращает файл с нулевым значением, даже если он имеет значение «0» или «пусто» «.

Читать:
Как сделать пнг рендер в блендере

Как я могу узнать, что целевой текстовый файл пуст или нет? (его следует различать, даже если в первой букве стоит «0»)

3 ответа

Если файл был успешно открыт для чтения в соответствии с fopen(filename, «r») , вы можете проверить, пуст ли он перед любой операцией чтения следующим образом:

ungetc() гарантированно работает как минимум с одним персонажем. Вышеупомянутая функция вернет 1 , если файл пуст или его нельзя прочитать из-за ошибки ввода-вывода. Вы можете определить это, проверив ferr(fp) или feof(fp) .

Если файл представляет собой поток, связанный с устройством или терминалом, тестовый код будет блокироваться до тех пор, пока не будет прочитан хотя бы один байт или пока не будет сигнализирован конец файла.

Если файл является обычным файлом, вы также можете использовать системный API для определения размера файла, например stat , lstat , fstat (в системах Posix).

Проверка на пустой файл

Я настоятельно рекомендую проверить приведенный ниже ответ @tee-dee, который на самом деле обеспечивает гораздо более точный способ определить, действительно ли файл пуст или нет, если вы имеете дело с текстовыми файлами. Большинство ответов здесь в значительной степени об использовании FileInfo.Length что правильно, но не выделяйте одну проблему с ним при работе с файлами, в конечном итоге содержащими метку порядка байтов (BOM). — Ayan

9 ответы

Проверить Существует свойство, чтобы узнать, существует ли файл вообще.

Протестировал. Это именно то, что я хочу. оценили и поставили галочку. Спасибо — аркадский

записки: new FileInfo( «file» ).Length бросит FileNotFoundException если файл не существует, поэтому, если есть случай, что файл не существует, обязательно проверьте Exists имущество перед проверкой Length . — Вальтер Стабош

Большая помощь. Спасибо! — дночерпатель

Проблема здесь в том, что файловая система изменчива. Учитывать:

Это может и происходит. Как правило, способ обработки сценариев файлового ввода-вывода заключается в том, чтобы переосмыслить процесс, чтобы использовать блоки исключений, а затем потратить время разработки на написание хороших обработчиков исключений.

Для программы ОП эти проблемы могут не вызывать беспокойства. «Лучшее — враг хорошего». — Брайан

FileInfo.Длина не будет работать во всех случаях, особенно для текстовых файлов. Если у вас есть текстовый файл, в котором раньше было какое-то содержимое, а теперь он очищен, длина может все еще не равняться 0, поскольку метка порядка байтов все еще может сохраняться.

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

Теперь FileInfo.Длина покажет размер, отличный от нуля.

Решением для этого является проверка длины < 6 на основе максимального размера, возможного для знак порядка байтов. Если ваш файл может содержать один байт или несколько байтов, выполните чтение файла, если длина < 6, и проверьте размер чтения == 0.

Похожие статьи