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

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

Как проверить, пуст ли файл в 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 , но в других сценариях вы можете посмотреть на дамп ядра.

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

Регистрация свойство, чтобы узнать, существует ли файл вообще.

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

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

Я обнаружил, что проверка FileInfo.Поле Length не всегда работает для определенных файлов. Например, и пустой .файл pkgdef имеет длину 3. Поэтому мне пришлось фактически прочитать все содержимое файла и вернуть, равно ли это пустой строке.

Что делать, если файл содержит пространство? FileInfo(«file»).Length равно 2.
Но я думаю, что файл также пуст (не имеет никакого контента, кроме пробелов (или разрывов строк)).

я использовал что-то вроде этого, но у кого-то есть идея получше?
Может кому-то помочь.

В дополнение к ответу @tanascius, вы можете использовать

и он будет делать это, только если файл существует, в инструкции catch вы можете создать файл и запустить код agin.

вот как я решил проблему. Сначала он проверит, существует ли файл, Затем проверьте длину. Я бы счел несуществующий файл фактически пустым.

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

У меня почему то GetFileSize получает какие то страшные числа, причём каждый раз — разные для одного и того же файла. Даже для пустого.

Можете сами проверить.

WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile(«C:\\001.txt»,&Data);
if(hFile == INVALID_HANDLE_VALUE)
printf(«INVALID HANDLE\n»);
else
<
DWORD size;

Вывел результат:
size: -858993460

Я читал. Вроде бы всё правильно.
Может расскажешь, в чём подвох?

ключевое слово high-order word. То-есть если у тебя файл меньше 4гиг, то нужно так:
printf(«size: %d\n»,GetFileSize(hFile,&size));
если файл больше то тогда твой размер будет вычисляться по формуле:
GetFileSize(hFile,&size) + size * 2^32.
так вы мсдн читаете, товарищи.. ))

Хмм. Помоему здесь функция размер не возвращает? А пишет его в size. Так что сия строчка мне не понятна 🙂

Ещё раз настоятельно рекомендую читать MSDN, а не придумывать самому, что куда возвращается.
[QUOTE=MSDN]
If the function succeeds, the return value is the low-order doubleword of the file size
[/QUOTE]
Кроме того, как уже сказал Dart Bobr, если файл заведомо меньше 4Гб, то второй аргумент вообще не нужен можем передавать NULL:

А что такое -1 ?
Читаем MSDN!
[QUOTE=MSDN]
If the function fails and lpFileSizeHigh is NULL, the return value is INVALID_FILE_SIZE. To get extended error information, call GetLastError.
[/QUOTE]
Пробовал получить информацию об ошибке? Попробуй.
Код ошибки будет 6, т.е. «The handle is invalid.»

Ой, а что же у нас с хендлом? А как мы его получили?
С помощью функции FindFirstFile. Читаем в MSDN об этой фукнкции:
[QUOTE=MSDN]
If the function succeeds, the return value is a search handle used in a subsequent call to FindNextFile or FindClose.
[/QUOTE]
Написано, что мы можем использовать полученный т.о. хендл для GetFileSize? НЕТ.

А как же нам получить нужный хендл?
Читаем в MSDN какой же хендл надо передавать в GetFileSize:
[QUOTE=MSDN]
hFile
[in] Handle to the file whose size is to be returned. This handle must have been created with either the GENERIC_READ or GENERIC_WRITE access right. For more information, see File Security and Access Rights.
[/QUOTE]
Если подумать логически или тыкнуть на ссылку «File Security and Access Rights», то обнаружится, что соотв. хендл для файла можно получить вызовом функции CreateFile.

Т.о. мы приходим к коду:

HANDLE hFile = CreateFile(«C:\\001.txt», GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_FILE_SIZE == hFile) <
—- ERROR —-
>

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *