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

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

  • автор:

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

Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст — возвращала NULL. Есть ли что то подобное?

13 ответов

03 мая 2007 года
14 / / 23.04.2007

WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile(«MyFile.bin»,&Data);
if (hFile)
DWORD size;
GetFileSize(hFile,&size);
>

04 мая 2007 года
816 / / 16.12.2004

Проблема такая: нужно сделать проверку файла на существование и на непустоту. Сейчас пока сделал проверку с помощью fopen, но это как то криво помоему(проверка на пустоту не реализована вообще пока).
В идеале требуется какая нить функция, которая в случае если файл содержит какую нить инфу, возвращала не ноль, а в случае если файла не существует, или он пуст — возвращала NULL. Есть ли что то подобное?

А чем не устраивает-то?:

bool IfFileExistsAndIsNotEmpty( AnsiString fPath )
char str[255];

ifstream file_re;
file_re.open( fPath.c_str() );

if ( ! file_re )
return false;
>

while ( ! file_re.getline( str, sizeof(str) ).eof() )
return true;
>

04 мая 2007 года
33 / / 15.01.2007

WIN32_FIND_DATA Data;
HANDLE hFile = FindFirstFile(«MyFile.bin»,&Data);
if (hFile)
DWORD size;
GetFileSize(hFile,&size);
>

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

05 мая 2007 года
139 / / 19.02.2006

Можно все сделать по простому считать из файла значения в какую нить переменную а потом if perem = ‘ ‘ пустой файл

05 мая 2007 года
1.4K / / 09.04.2004
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна 😉
06 мая 2007 года
456 / / 07.03.2004
Ну раз уж проблема с GetFileSize.
FILE *f = fopen(filename, «r»);
fseek(f, 0, SEEK_END);
unsigned int size = ftell(f);
07 мая 2007 года
33 / / 15.01.2007
а ты точно значение переменной смотришь, а не указателя?? по-моему эта функция глючить не должна 😉

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

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

07 мая 2007 года
4.8K / / 20.01.2000

Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.

08 мая 2007 года
33 / / 15.01.2007

Для mathers и Kortar:
Я настоятельно рекомендую почитать описание функции GetFileSize в MSDN.
Там всё предельно ясно сказано.

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

08 мая 2007 года
1.4K / / 09.04.2004

lpFileSizeHigh
[out] Pointer to the variable where the high-order word of the file size is returned. This parameter can be NULL if the application does not require the high-order word.

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

08 мая 2007 года
33 / / 15.01.2007

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

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

printf(«size: %d\n»,GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал — всегда выдаётся «-1»
08 мая 2007 года
4.8K / / 20.01.2000

Хмм. Помоему здесь функция размер не возвращает? А пишет его в 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:

DWORD size = GetFileSize(hFile, NULL);
printf(«size: %d\n»,GetFileSize(hFile,&size));
В любом случае, если делать так, как ты написал — всегда выдаётся «-1»

А что такое -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 —-
>

DWORD size = GetFileSize(hFile, NULL);

Так что НАСТОЯТЕЛЬНО рекомендую читать MSDN и пытаться думать.

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

Решаю задачу на определение симметричности массива, ну или является ли полиндромом,иначе говоря. Если симметрична, то вывожу 1, иначе 0. В файле сначала вводится кол-во элементов массива,а потом только последовательность чисел. Проблема в том, что никак не получается корректно проверить файл на пустоту. Если файл полностью пустой — вывести 0. Я использовал и if(!(fin >> number)) fout << 0; и if(fin.tellg() == 0) и другие.
Но ответ в таком случае выводит неккоректно. Даже если ввел симметричную последовательность чисел в файл, выводит 0. Посоветуйте что-то еще.

#include #include using namespace std; bool symmetry(int array[], int begin, int end)< < return (begin >= end) || ((array[begin] == array[end]) && (symmetry(array, begin + 1, end - 1))); > return 0; > int main()< ifstream fin("input.txt"); ofstream fout("output.txt"); int number, count = 0, size, a = 0; if(!(fin >> number)) //проверка на пустоту while(fin >> number) fin.clear(); fin.seekg(0, ios::beg); fin >> number; size = number; int array[size]; if (size == 0) if(size > number; array[count++] = number;> > else< for(int i = 0; i < a-1; i++) > number; array[count++] = number;> > for(int i = 0; i < count; i++)if(symmetry(array, 0, count-1) == true) fout

Отслеживать
задан 21 сен 2022 в 8:17
321 3 3 серебряных знака 13 13 бронзовых знаков

Никак не пойму, где в коде увы пытаетесь проверить файл на пустоту? И что такое пустота? Если в нем, например, одни пробелы или пустые строки, но нет чисел — это пустота?

21 сен 2022 в 8:46
Щас подправлю, а пустой имеется ввиду когда ничего нет в файле. @Harry
21 сен 2022 в 9:45

Ну и что не так? Если файла нет или в нем нет числа - создается output.txt с 0 внутри. А вы что хотите?

21 сен 2022 в 10:08

Ну так он всегда выводит 0. А это мне не нужно. Я хочу чтобы все было корректно. А именно, если я ввел симметрическую последовательность 4 1 2 2 1 (4 - это длин последовательности чисел,т.е 1 2 2 1), то он должен выдать 1, если он не симметричный, выдаст 0. А если файл пустой - выдает 0. Но сейчас он работает не так - он всегда выводит 0. А почему, мне вот это интересно. Как сделать так,чтобы было корректно

21 сен 2022 в 11:20

Да сами посмотрите, вы же как минимум одно число не дочитываете. Грубо говоря, в файле 1 2 3 2 1 , а в массиве 1 2 3 2 .

Как проверить имеющийся список на пустоту?

Программа имеет на входе список, который заполняется из файла Text.txt (который в ресурсах программы) и выводит все элементы из списка и их сумму. Пример для файла с содержанием "1 2 3 4 5 6": 1 2 3 4 5 6 21
Где "21" - сумма всех чисел из файла (списка). Так же имеется функция на проверку списка на пустоту:

bool isEmpty(Tlist list) < //проверка списка на пустоту return list == NULL; >

Но я не могу понять, куда надо вставить её в программу, чтобы в случае пустого списка выводилась информация о том, что список пуст. Код программы (функции в другом файле объявлены через заголовочный файл):
Основной файл:

#include "Header.h" #include #include #include #include #include using namespace std; int main()

Файл с функциями:

#include "Header.h" #include #include #include using namespace std; void initList(Tlist &list) < //инициализация списка list = NULL; >bool isEmpty(Tlist list) < //проверка списка на пустоту return list == NULL; >void addToHead(Tlist &list, int element) < //добавление элемента в начало списка Tlist p = new Node; p->data = element; p->next = list; list = p; > void addAfterNode(Tlist pNode, int element) < //добавление элемента в список после заданного Tlist p = new Node; p->data = element; p->next = pNode->next; pNode->next = p; > Tlist findPlace(Tlist list, int elem) < //создание упорядоченного списка Tlist current = list; while ((current->next != 0) && (current->next->data < elem)) current = current->next; return current; > void createByOrder(Tlist &list, string text) < initList(list); ifstream ifin(text); int elem; while (!ifin.eof()) < ifin >> elem; cout data > elem)) addToHead(list, elem); else < Tlist place = findPlace(list, elem); addAfterNode(place, elem); >> > int sum(Tlist list) < int S = 0; Tlist current = list; while (current != NULL) < S += current->data; current = current->next; > return S; > void at_the_end(Tlist &list, int elem) < Tlist current = list; while (current->next != NULL) < current = current->next; > addAfterNode(current, elem); > void printList(Tlist list) < //печать списка Tlist current = list; while (current != NULL) < cout data next; > >
  • Вопрос задан более трёх лет назад
  • 2108 просмотров

1 комментарий

Простой 1 комментарий

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

Есть модуль под node.js, называется fs.
Задача такая: мне нужно проверять наличие содержимого файла и при определенных условиях что-то уже с этим файлом делать.

Ну т.е. ЕСЛИ файл пустой, то удаляем его, например.

Либо я не внимателен, либо проблемы с восприятием каких-то методов этого модуля. Как выполнить такую проверку? Если есть аналоги более интересных аналогов, то посоветуйте.

  • Вопрос задан более трёх лет назад
  • 1105 просмотров

Комментировать
Решения вопроса 1

Omashu

const stat = fs.statSync('./path/to/file'); console.log(stat.size);

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

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