Перейти к содержимому

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

  • автор:

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

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

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

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

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

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

Omashu

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

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

Добрый день! Мне нужно написать программу, которая после открытия файла будет делать проверку, пуст этот файл или нет. Подскажите, пожалуйста, как это можно сделать на с++?

#include #include int main(int argc, char* argv[]) < std::ifstream file( "example.txt", std::ios::binary | std::ios::ate); // Вывод размера файла std::cout

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

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

Решаю задачу на определение симметричности массива, ну или является ли полиндромом,иначе говоря. Если симметрична, то вывожу 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
305 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 .

Ввод данных из файла и вывод в файл в языке программирования С

До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в Си реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.

В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:

FILE *myfile;

С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения "r", записи "w" или добавления "a" и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:

myfile = fopen("hello.txt", "r");

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

При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile ).

Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL . В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.

Объявление функции fopen содержится в заголовочном файле stdio.h , поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE .

После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве аргумента ей передается указатель на файл:

fclose(myfile);

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

Чтение из текстового файла и запись в него

fscanf

Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:

fscanf(myfile, "%s%d", str, &a); 

Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.

Допустим, у нас есть файл содержащий такое описание объектов:

apples 10 23.4 bananas 5 25.0 bread 1 10.3

Тогда, чтобы считать эти данные, мы можем написать такую программу:

#include int main () { FILE *file; struct food { char name[20]; unsigned qty; float price; }; struct food shop[10]; char i = 0; file = fopen("goods.txt", "r"); while (fscanf(file, "%s%u%f", shop[i].name, &(shop[i].qty), &(shop[i].price)) != EOF) { printf("%s %u %.2f\n", shop[i].name, shop[i].qty, shop[i].price); i++; } }

В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.

fgets

Функция fgets() осуществляет построчный ввод из файла. Один вызов fgets() позволят прочитать одну строку. При этом можно прочитать не всю строку, а лишь ее часть от начала. Параметры fgets() выглядят таким образом:

fgets(массив_символов, количество_считываемых_символов, указатель_на_файл)
fgets(str, 50, myfile)

Такой вызов функции прочитает из файла, связанного с указателем myfile , одну строку текста полностью, если ее длина меньше 50 символов с учетом символа '\n', который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ '\0', добавленный fgets . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет '\0'. В таком случае '\n' в считанной строке содержаться не будет.

#include #define N 80 int main() { FILE *file; char arr[N]; file = fopen("goods.txt", "r"); while (fgets(arr, N, file) != NULL) printf("%s", arr); printf("\n"); fclose(file); }

В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr . Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.

getc или fgetc

Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.

#include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }

Приведенный в качестве примера код выводит данные из файла на экран.

Запись в текстовый файл

Также как и ввод, вывод в файл может быть различным.

  • Форматированный вывод. Функция fprintf( файловый_указатель, строка_формата, переменные ) .
  • Построчный вывод. Функция fputs( строка, файловый_указатель ) .
  • Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .

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

Запись в каждую строку файла полей одной структуры (прерывание в Linux ‒ Ctrl + D ):

#include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }

Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки '\n'):

#include int main () { FILE *file; char str[10]; file = fopen("output.txt", "w"); while (scanf("%s", str) != EOF) { fputs(str, file); fputs("\n", file); } fclose(file); }

Пример посимвольного вывода:

#include int main() { FILE *file; char i; file = fopen("output.txt", "w"); while ((i = getchar()) != EOF) fputc(i, file); fclose(file); }

Чтение из двоичного файла и запись в него

С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.

При открытии файла для двоичного доступа, вторым аргументом fopen() является строка "rb" или "wb".

Тема о работе с двоичными файлами достаточно сложная, для ее изучения требуется отдельный урок. Здесь будут отмечены только особенности функций чтения-записи в файл, который рассматривается как поток байтов.

Функции fread() и fwrite() имеют следующие параметры:

  1. адрес области памяти, куда данные записываются или откуда считываются,
  2. размер одного данного какого-либо типа,
  3. количество считываемых данных указанного размера,
  4. файловый указатель.

Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно "заказать" считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.

Пример использования функций fread() и fwrite() :

#include #include int main() { FILE *file; char shelf1[50], shelf2[100]; int n, m; file = fopen("shelf1.txt", "rb"); n = fread(shelf1, sizeof(char), 50, file); fclose(file); file = fopen("shelf2.txt", "rb"); m = fread(shelf2, sizeof(char), 50, file); fclose(file); shelf1[n] = '\0'; shelf2[m] = '\n'; shelf2[m+1] = '\0'; file = fopen("shop.txt", "wb"); fwrite(strcat(shelf2, shelf1), sizeof(char), n+m, file); fclose(file); }

Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.

Курс с решением задач:
pdf-версия

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

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