Как узнать количество элементов в файле c

Обновлено: 04.07.2024

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

Текстовыми называются файлы, состоящие из любых символов. Они организуются по строкам, каждая из которых заканчивается символом «конца строки». Конец самого файла обозначается символом «конца файла». При записи информации в текстовый файл, просмотреть который можно с помощью любого текстового редактора, все данные преобразуются к символьному типу и хранятся в символьном виде.

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

Для работы с файлами используются специальные типы данных, называемые потоками. Поток ifstream служит для работы с файлами в режиме чтения, а ofstream в режиме записи. Для работы с файлами в режиме как записи, так и чтения служит поток fstream.

В программах на C++ при работе с текстовыми файлами необходимо подключать библиотеки iostream и fstream.

Для того чтобы записывать данные в текстовый файл, необходимо:

  1. описать переменную типа ofstream.
  2. открыть файл с помощью функции open.
  3. вывести информацию в файл.
  4. обязательно закрыть файл.

Для считывания данных из текстового файла, необходимо:

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

Запись информации в текстовый файл

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

ofstream F;

Будет создана переменная F для записи информации в файл. На следующим этапе файл необходимо открыть для записи. В общем случае оператор открытия потока будет иметь вид:

F.open(«file», mode);

Здесь F — переменная, описанная как ofstream, file — полное имя файла на диске, mode — режим работы с открываемым файлом. Обратите внимание на то, что при указании полного имени файла нужно ставить двойной слеш. Для обращения, например к файлу accounts.txt, находящемуся в папке sites на диске D, в программе необходимо указать: D:\\sites\\accounts.txt.

Файл может быть открыт в одном из следующих режимов:

  • ios::in — открыть файл в режиме чтения данных; режим является режимом по умолчанию для потоков ifstream;
  • ios::out — открыть файл в режиме записи данных (при этом информация о существующем файле уничтожается); режим является режимом по умолчанию для потоков ofstream;
  • ios::app — открыть файл в режиме записи данных в конец файла;
  • ios::ate — передвинуться в конец уже открытого файла;
  • ios::trunc — очистить файл, это же происходит в режиме ios::out;
  • ios::nocreate — не выполнять операцию открытия файла, если он не существует;
  • ios::noreplace — не открывать существующий файл.

Параметр mode может отсутствовать, в этом случае файл открывается в режиме по умолчанию для данного потока.

После удачного открытия файла (в любом режиме) в переменной F будет храниться true, в противном случае false. Это позволит проверить корректность операции открытия файла.

Открыть файл (в качестве примера возьмем файл D:\\sites\\accounts.txt) в режиме записи можно одним из следующих способов:

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

Если вы хотите открыть существующий файл в режиме дозаписи, то в качестве режима следует использовать значение ios::app.

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

Например, для записи в поток F переменной a, оператор вывода будет иметь вид:

Для последовательного вывода в поток G переменных b, c, d оператор вывода станет таким:

Закрытие потока осуществляется с помощью оператора:

F.close();

В качестве примера рассмотрим следующую задачу.

Задача 1

Создать текстовый файл D:\\sites\\accounts.txt и записать в него n вещественных чисел.

Решение

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

Чтение информации из текстового файла

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

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

Например, для чтения данных из потока F в переменную a, оператор ввода будет выглядеть так:

Два числа в текстовом редакторе считаются разделенными, если между ними есть хотя бы один из символов: пробел, табуляция, символ конца строки. Хорошо, когда программисту заранее известно, сколько и какие значения хранятся в текстовом файле. Однако часто известен лишь тип значений, хранящихся в файле, при этом их количество может быть различным. Для решения данной проблемы необходимо считывать значения из файла поочередно, а перед каждым считыванием проверять, достигнут ли конец файла. А поможет сделать это функция F.eof(). Здесь F — имя потока функция возвращает логическое значение: true или false, в зависимости от того достигнут ли конец файла.

Следовательно, цикл для чтения содержимого всего файла можно записать так:

//организуем для чтения значений из файла, выполнение
//цикла прервется, когда достигнем конец файла,
//в этом случае F.eof() вернет истину
while ( ! F. eof ( ) )
<
//чтение очередного значения из потока F в переменную a
F >> a ;
//далее идет обработка значения переменной a
>

Для лучшего усвоения материала рассмотрим задачу.

Задача 2

В текстовом файле D:\\game\\accounts.txt хранятся вещественные числа, вывести их на экран и вычислить их количество.

Решение

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

На этом относительно объемный урок по текстовым файлам закончен. В следующей статье будут рассмотрены методы манипуляции, при помощи которых в C++ обрабатываются двоичные файлы.

удаляет файл на внешнем но­сителе, с которым связана файловая переменная.

Переименование файлов. Процедура

Rename (<имя файловой переменной>,

'<новое имя на дис­ке>')

переименовывает файл, связанный с данной фай­ловой переменной.

Пример 1

Ввести с клавиатуры и записать в файл DAN1.DAT последовательность целых чисел.

Решение

Program Example_83;

Var F: File Of Integer;

Begin

с файлом на диске>

Writeln('Конец ввода чисел - 0');

записываем его в файл>

If n<>0 Then Write(F, n);

End.

Пример 2

В файле DAN1.DAT записаны целые числа (см. пре­дыдущую задачу). Вычислить сумму элементов файла и результат вместе с исходными данными записать в файл DAN2.DAT.

Program Example_84;

VarF1, F2: File Of Integer;

While Not EOf (F1) Do

Begin

end;

в конец файла F2>

в файле DAN2.DAT')

End.

Текстовые файлы

Текстовые файлы состоят из символьных строк. Стро­ки могут иметь различную длину, и в конце каждой строки стоит признак конца строки. Для описания текстовых файлов используется служебное слово Text:

Var A: Text;

Обработка текстовых файлов

Для обработки текстовых файлов используются те же процедуры и функции, что и для обработки обычных ти­пизированных файлов. Для связывания файловой перемен­ной с файлом на диске употребляется процедура Assign. Текстовые файлы могут быть открыты для чтения про­цедурой Reset или для записи процедурой Rewrite.

Для чтения данных применяется процедура Read. Если необходимо после чтения данных перейти на сле­дующую строку, то используется процедура Readln. Если необходимо просто перейти к следующей строке, то можно использовать процедуру

Readln (<имя фай­ловой переменной

кото­рая устанавливает файловый указатель на первый эле­мент следующей строки.

Процедура Write записывает данные в текущую строку. Если надо записать данные и перейти к следу­ющей строке, то можно использовать процедуру Writeln. Если требуется только перейти для записи на новую строку, то применяется процедура

Writeln (<имя файловой переменной

которая записывает в файл признак конца строки и устанавливает файловый указатель на начало следующей строки.

Так как в строках может быть разное количество символов, имеется логическая функция

Еоln (<имя файловой переменной

ко­торая принимает значение True, если достигнут конец строки.

Кроме перечисленных процедур и функций, к текс­товым файлам применяется процедура

Арреnd (<имя файловой переменной

Она открывает файл для "дозаписи", помещая файловый ука­затель в конец файла.

Пример 1

Дан текстовый файл, содержащий только целые чис­ла, в каждой строке может быть несколько чисел, кото­рые разделяются пробелами. Вывести на экран все числа с учетом разбиения на строки и подсчитать количество элементов в каждой строке.

Решение

Пусть в файле содержится следующая информация:

-32
-5 -8
-8 -12
-1 -2 -4
-1 -2

Этот файл можно создать в среде Турбо Паскаль следующим образом:

¨ создайте новый файл посредством командыNewменю File;

¨ запишите все числа, разделяя их пробелами, и разбейте на строки, как указано в задании;

¨ сохраните файл, например, под именем INT1.DAT. Этот файл используется в программе, которая при­ведена ниже.

Program Example_85;

Var F: Text;

Begin

файловую переменную с файлом на диске>

While Not Eof (F) Do

Begin

While Not Eoln(F) Do

Begin

End;

Writeln('В строке ', k,' элементов');

Readln(F);

End;

End.

Пример 2

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

Решение

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

То есть, количество элементов, которые может содержать массив?

ОТВЕТЫ

Ответ 1

Управляющее резюме:

Полный ответ:

Чтобы определить размер вашего массива в байтах, вы можете использовать оператор sizeof :

На моем компьютере длина целых 4 байта, поэтому n равно 68.

Чтобы определить количество элементов в массиве, мы можем разделить общий размер массива на размер элемента массива. Вы можете сделать это с типом, как это:

и получить правильный ответ (68/4 = 17), но если тип изменился вы бы неприятная ошибка, если вы забыли изменить a sizeof(int) , а также.

Поэтому предпочтительным делителем является sizeof(a[0]) , размер нулевого элемента массива.

Еще одним преимуществом является то, что теперь вы можете легко параметризовать имя массива в макросе и получить:

Ответ 2

Способ sizeof - это правильный путь iff, который вы имеете в виду массивы, не полученные в качестве параметров. Массив, отправленный как параметр функции, рассматривается как указатель, поэтому sizeof вернет размер указателя вместо массива.

Таким образом, внутри функций этот метод не работает. Вместо этого всегда передавайте дополнительный параметр size_t size , указывающий количество элементов в массиве.

Выход (в 64-разрядной ОС Linux):

Выход (в 32-разрядной ОС Windows):

Ответ 3

Стоит отметить, что sizeof не помогает при работе со значением массива, которое разложилось на указатель: хотя он указывает на начало массива, компилятору он совпадает с указателем на один элемент этого массива. Указатель не "помнит" ничего о массиве, который использовался для его инициализации.

Ответ 4

Размерный "трюк" - это лучший способ, который я знаю, с одним маленьким, но (для меня это является основным мозолем для домашних животных) важное изменение в использовании скобок.

Как ясно из Википедии, C sizeof не является функцией; это оператор . Таким образом, он не требует скобок вокруг своего аргумента, если аргумент не является именем типа. Это легко запомнить, поскольку он делает аргумент похожим на литое выражение, которое также использует скобки.

Итак: Если у вас есть следующее:

Вы можете найти количество элементов с таким кодом:

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

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

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

Например, скажем, у вас есть функция, которая выводит некоторые данные в виде потока байтов, например, по сети. Позвольте вызвать функцию send() и заставить в качестве аргументов указывать указатель на отправляемый объект и количество байтов в объекте. Итак, прототип будет выглядеть следующим образом:

Теперь вы ввели тонкий способ стрелять себе в ногу, указав тип foo в двух местах. Если кто-то меняет, а другой - нет, код прерывается. Таким образом, всегда делайте это так:

Теперь вы защищены. Конечно, вы дублируете имя переменной, но это имеет высокую вероятность взлома способом, который может обнаружить компилятор, если вы его измените.

Ответ 5

Откроется эта ссылка для объяснения

Ответ 6

Вы можете использовать оператор sizeof, но он не будет работать для функций, потому что для ссылки на указатель вы можете сделать следующее, чтобы найти длину массива:

Ответ 7

Если вам известен тип данных массива, вы можете использовать что-то вроде:

Или, если вы не знаете тип данных массива, вы можете использовать что-то вроде:

Примечание. Эта вещь работает только в том случае, если массив не определен во время выполнения (например, malloc), и массив не передается в функции. В обоих случаях arr (имя массива) является указателем.

Ответ 8

Макрос ARRAYELEMENTCOUNT(x) , который каждый использует, оценивает неправильно. Это реалистично, это просто деликатный вопрос, потому что вы не можете иметь выражения, которые приводят к типу "массив".

Фактически оценивается как:

Он правильно оценивает:

Это действительно не имеет особого отношения к размеру массивов явно. Я только что заметил много ошибок, не наблюдая, как работает препроцессор C. Вы всегда переносите параметр макроса, а не включаете в него выражение.

Это правильно; мой пример был плохим. Но это на самом деле то, что должно произойти. Как уже упоминалось ранее, p + 1 закончится как тип указателя и аннулирует весь макрос (как если бы вы попытались использовать макрос в функции с параметром указателя).

В конце дня, в данном конкретном случае, ошибка не имеет большого значения (поэтому я просто теряю время, huzzah!), потому что у вас нет выражений с типом "массива", Но на самом деле вопрос о тонкостях оценки препроцессора, я думаю, является важным.

Ответ 9

Для многомерных массивов это несколько сложнее. Часто люди определяют явные макроконстанты, т.е.

Но эти константы могут быть вычислены и во время компиляции с sizeof:

Обратите внимание, что этот код работает в C и С++. Для массивов с более чем двумя измерениями используйте

и т.д., ad infinitum.

Ответ 10

Размер массива в C:

Ответ 11

Ответ 12

"вы ввели тонкий способ стрелять себе в ногу"

C 'native' массивы не сохраняют свой размер. Поэтому рекомендуется сохранять длину массива в отдельной переменной /const и передавать его всякий раз, когда вы передаете массив, а именно:

Вы ДОЛЖНЫ всегда избегать встроенных массивов (если только вы не можете, и в этом случае, обратите внимание на вашу ногу). Если вы пишете С++, используйте контейнер STL. "По сравнению с массивами они обеспечивают почти ту же производительность", и они гораздо полезнее!

Ответ 13

Ответ 14

@Магнус: стандарт определяет sizeof как уступающий количеству байтов в объекте, а sizeof (char) всегда один. Количество бит в байте является специфичным для реализации.

Изменить: стандартный раздел ANSI С++. 5.3.3. Размер:

Оператор sizeof дает количество байтов в представлении объекта своего операнда. [. ] sizeof (char), sizeof (подпись char) и sizeof (без знака char) равны 1; результат sizeof, применяемый к любому другому фундаментальному типу, определяется реализацией.

Раздел 1.6 Модель памяти С++:

Основным блоком памяти в модели памяти С++ является байт. Байт, по меньшей мере, достаточно большой, чтобы содержать любой элемент базового набора символов выполнения и состоит из непрерывной последовательности бит, число которых определяется реализацией.

Ответ 15

@Skizz: Я уверен, что я прав, хотя лучший "источник", который я могу вам дать в данный момент, - это Википедия, из статьи о sizeof:

Википедия ошибается, Skizz прав. sizeof (char) равен 1, по определению.

Я имею в виду, просто внимательно прочитайте запись в Википедии, чтобы понять, что это неправильно. msgstr "кратные char". sizeof(char) никогда не может быть ничего, кроме "1". Если бы это было, скажем, 2, это означало бы, что sizeof(char) был в два раза меньше char!

Ответ 16

Если вы действительно хотите сделать это, чтобы передать свой массив, я предлагаю реализовать структуру для хранения указателя на тип, в котором вы хотите получить массив и целое число, представляющее размер массива. Затем вы можете передать это своим функциям. Просто присвойте значение переменной массива (указатель на первый элемент) этому указателю. Затем вы можете перейти Array.arr[i] , чтобы получить i-й элемент и использовать Array.size , чтобы получить количество элементов в массиве.

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

Ответ 17

Лучший способ сохранить эту информацию, например, в структуре:

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

Ответ 18

Функция sizeof возвращает количество байтов, которое используется вашим массивом в памяти. Если вы хотите вычислить количество элементов в вашем массиве, вы должны разделить это число с типом переменной sizeof массива. Пусть say int array[10]; , если целочисленное целое число переменной на вашем компьютере равно 32 бит (или 4 байта), чтобы получить размер вашего массива, вы должны сделать следующее:


Бывают случаи, когда вам нужно точно знать, сколько файлов или папок хранится в определенной папке. Независимо от того, работаете ли вы для своей статистики или если у вас есть устройство Windows, существует множество способов, которыми вы можете найти эту информацию. Мы решили написать статью, в которой мы собираемся показать вам все методы, которые мы знаем, для подсчета элементов, найденных внутри папки.

ПРИМЕЧАНИЕ. Методы подсчета файлов и папок, которые мы покажем в этой статье, работают аналогично в Windows 10, Windows 8.1 и Windows 7. Для простоты мы будем использовать только скриншоты, сделанные в Windows 10.

Метод 1. Используйте Проводник для выбора файлов и папок, которые вы хотите подсчитать

Первый метод предполагает использование Проводника / Проводника Windows . Откройте «Проводник» и перейдите к папке, в которой хранятся элементы, которые вы хотите подсчитать.

Общее количество элементов (файлов и папок), хранящихся внутри, отображается в нижнем левом углу пользовательского интерфейса File Explorer.


Если вы хотите считать только некоторые из файлов или папок, хранящихся в вашей папке, выберите их все и посмотрите на нижнюю левую часть интерфейса File Explorer. Он отобразит количество выбранных элементов.


Способ 2. Используйте окно «Свойства» для рекурсивного подсчета всех файлов и папок



Метод 3. Используйте командную строку для рекурсивного подсчета всех файлов и папок


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



Метод 4. Используйте PowerShell для подсчета всех файлов и папок


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


Если вы хотите подсчитать только папки внутри родительской папки, выполните следующую команду:


Если вы хотите знать только количество файлов, запустите эту команду:


Если вы хотите рекурсивно подсчитывать папки и/или файлы в родительской папке, добавьте параметр Recurse в предыдущие команды следующим образом:

  • Рекурсивно подсчитывать все файлы и папки: Get-ChildItem -Recurse | Measure-Object | % Get-ChildItem -Recurse | Measure-Object | %
  • Рекурсивно подсчитывать только папки: Get-ChildItem -Recurse -Directory | Measure-Object | % Get-ChildItem -Recurse -Directory | Measure-Object | %
  • Рекурсивно считать только файлы: Get-ChildItem -Recurse -File | Measure-Object | % Get-ChildItem -Recurse -File | Measure-Object | %


Заключение

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

Читайте также: