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

Обновлено: 07.07.2024

Примеры использования средств C++ для работы с файлами

В теме приводятся примеры использования файловой системы C++ для:

  • чтения информации из файлов;
  • записи информации в файлы.

Содержание

  • 1. Функция, читающая строки из клавиатуры и записывающая их в файл
  • 2. Функция, которая читает текстовый файл и выводит его содержимое на экран
  • 3. Пример бесформатного ввода/вывода. Копирование одного файла в другой
  • 4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()
  • 5. Пример функции записывающей структурную переменную в файл
  • 6. Пример чтения структурной переменной из файла
  • 7. Пример чтения/записи массива структур в файл. Функции write() , read()
  • 8. Пример записи/чтения массива чисел типа double
  • 9. Пример чтения из файла строк. Функция getline()
  • 10. Пример чтения строк из файла. Функции getline() + eof()

Поиск на других ресурсах:

1. Функция, читающая строки из клавиатуры и записывающая их в файл

Результат работи программы:

2. Функция, которая читает текстовый файл и выводит его содержимое на экран

Функция Example2() читает содержимое файла filename , имя которого есть входящим параметром функции.

3. Пример бесформатного ввода/вывода. Копирование одного файла в другой

В примере реализована функция Example3() , которая выполняет копирование файлов в двоичном (бинарном) формате. Функция получает два параметра. Первый параметр типа const char* есть имя файла-источника. Второй параметр типа const char* есть имя файла-назначения.
Функция реализует посимвольное копирование. Для получения символа из файла-источника используется функция get() .

Вызов функции Example3() из функции main() может быть следующим:

4. Пример бесформатного ввода/вывода. Копирование одного файла в другой. Функция put()

Функция Example4() из данного примера работает также как и предыдущая, только вместо вывода в поток << используется функция put() . Также, с помощью функции is_open() выполняется проверка на корректность открытия файла.

5. Пример функции записывающей структурную переменную в файл

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

Реализована функция Example5() , которая выполняет запись структурной переменной типа BOOK в файл, имя которого есть входящим параметром. Функция Example5() использует функцию write() для записи. Файл открывается в двоичном формате ( ios::binary ).

6. Пример чтения структурной переменной из файла

Данный пример есть продолжением предыдущего примера из пункта 5. В примере в функции Example6() заполняется значение структурной переменной типа BOOK . Полученное значение формируется как входящий параметр-ссылка на тип BOOK . Также функция получает параметром имя файла для чтения. Для чтения структурной переменной используется функция read() .

Результат работы программы

8. Пример записи/чтения массива чисел типа double
  • запись в файл массива M чисел типа double функцией write() ;
  • чтение из файла массива чисел типу double функцией read() .

Файл открывается в двоичном формате.

Результат работи программы:

9. Пример чтения из файла строк. Функция getline()
10. Пример чтения строк из файла. Функции getline() + eof()

В примере реализована функция Example10() , которая выполняет чтение строк из файла. Файл открывается в текстовом формате. Имя файла задается входящим параметром функции. Определение конца файла выполняется с помощью функции eof() .

Репутация: нет
Всего: нет

Полскажите пожалуйста,как прочитать структуры из файла работать надо в Visual C++6.Задача такая:нужно записать в текстовый файл некоторую инфу.Мне нужно считать ее и упорядочить эти записи по алфавиту,а затем еще вывести определенные из них.Но как записать ее в файл правильно.И не проще ли будет обойтись без структур и работать просто со строчками? Заранее спасибо!!

Репутация: 13
Всего: 31

Чтобы иметь большой гардероб - надо иметь большой гардероб.

Репутация: 7
Всего: 12

Все зависит от того:
1) сколько времени тебе нужно на разработку программы;
2) надо ли будет просматривать этот файл текстовым редактором;
3) какую ты пишешь информацию (строки отличаются от структур, так что напиши подробнее, что дано).
Совет учиться на ошибках других бесполезен; научиться чему-либо можно только на собственных ошибках. (Бернард Шоу)
Не откладывай на завтра то, что можешь сделать сегодня. (Пословица)
А теперь выпишем точное значение числа пи. (Препод)
Жахни, Пендальф! © Гоблин

Репутация: 25
Всего: 30

Пример считывания и записи в(из) файла, Borland C++ Builder 6. Должно и на Visual C++ работать.

Репутация: нет
Всего: нет

Здарвствуйте спасибо что ответили.Эту программу я сделал,очень просттым способом.И мне сказали ее переделать.Теперь надо созать текстовый файл с записанной в него информацией например:
"Бузина черная,Sambucus nigra,растет у дорог,многолетнее,лекарственное"т.е. это одна структура.Это поля структуры записанные зерез запятую в строчку.Таким образом мне надо считать из этого файла эту структуру(этих строк штук 30).Затем упорядочить этот файл по русским названиям,причем не используя массива указателей,а сортировать в файле.Далее вывести запись в видестуктуры если выполняется условие:растение лекарственное и произрастает на лугах.Главное затруднение у меня вызывает чтение из файла такого вида структуры(да информацию дописывают в файл не через программу) и сортировка в файле.Объясноте,а еще лучше покажите пожалуйста на примерах как все это можно сделать на Visual C++.Всем кто откликнется заранее большое спасибо.

Репутация: 25
Всего: 30

Цитата
Это поля структуры записанные зерез запятую в строчку.
И все структуры с одинаковым количеством полей, т.е. по пять штук ?
Цитата
причем не используя массива указателей,а сортировать в файле.Далее вывести запись в видестуктуры
Как в файле сортировать - этого я тебе неподскажу. незнаю как, а что значит - вывести в видеоструктуры?
А считать из файла так можно:

struct STRING
string str1, str2, str3, str4, str5;
>;

Репутация: нет
Всего: нет

Да полей по пять штук.Точнее это описание растений:русское и латинское название,место произрастание,продолжительность жизни,назначение.А вывести в виде структуры т.е.одному растению соответствовали эти пять полей.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

[ Время генерации скрипта: 0.1116 ] [ Использовано запросов: 21 ] [ GZIP включён ]

Я делаю программу под названием «Диспетчер книг», теперь нужно создать функции для сохранения и загрузки книг (структур) из файла. Мне интересно, как их читать. Вот мое определение структуры:

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

Пример файла, который я хочу прочитать из внешности:

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

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

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

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

Вы можете использовать двоичный файловый ввод / вывод, используя структуры fread () / fwrite () напрямую. Вы должны будете использовать структуру фиксированного размера. Ниже приведен простой пример. Он не выполняет всю необходимую проверку ошибок, но этого должно быть достаточно, чтобы начать работу.

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

Измените определение вашей книги на:

А затем в loadBook:

Вот как я решил свою проблему, используя код Chimera.

И моя функция письма:

Спасибо за помощь.

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

Настоятельно рекомендуем отделить чтение от разбора.

Затем проанализируйте строку и верните значение, обозначающее 1: успех, 0: сбой или конец файла: EOF

Теперь разбираем buffer[] . Существует много подходов с различными плюсами и минусами. Следующее активно использует "%n" для сохранения смещения сканирования до этой точки.

strdup() - это распространенная, но нестандартная функция, которая выделяет память и дублирует строку. Пример кода Обязательно освободите выделенное пространство, когда закончите с book .

Для удобства обращения информация в запоминающих устройствах хранится в виде файлов.

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

Каталог ( папка , директория ) – именованная совокупность байтов на носителе информации, содержащая название подкаталогов и файлов, используется в файловой системе для упрощения организации файлов.

Файловой системой называется функциональная часть операционной системы, обеспечивающая выполнение операций над файлами. Примерами файловых систем являются FAT (FAT – File Allocation Table, таблица размещения файлов), NTFS, UDF (используется на компакт-дисках).

Существуют три основные версии FAT: FAT12, FAT16 и FAT32. Они отличаются разрядностью записей в дисковой структуре, т.е. количеством бит, отведённых для хранения номера кластера. FAT12 применяется в основном для дискет (до 4 кбайт), FAT16 – для дисков малого объёма, FAT32 – для FLASH-накопителей большой емкости (до 32 Гбайт).


Рассмотрим структуру файловой системы на примере FAT32.

Файловая структура FAT32

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

Сектор – минимальная адресуемая единица хранения информации на внешних запоминающих устройствах. Как правило, размер сектора фиксирован и составляет 512 байт. Для увеличения адресного пространства устройств внешней памяти сектора объединяют в группы, называемые кластерами.

Кластер – объединение нескольких секторов, которое может рассматриваться как самостоятельная единица, обладающая определёнными свойствами. Основным свойством кластера является его размер, измеряемый в количестве секторов или количестве байт.

Файловая система FAT32

Файловая система FAT32 имеет следующую структуру.

Нумерация кластеров, используемых для записи файлов, ведется с 2. Как правило, кластер №2 используется корневым каталогом, а начиная с кластера №3 хранится массив данных. Сектора, используемые для хранения информации, представленной выше корневого каталога, в кластеры не объединяются.
Минимальный размер файла, занимаемый на диске, соответствует 1 кластеру.

Загрузочный сектор начинается следующей информацией:

  • EB 58 90 – безусловный переход и сигнатура;
  • 4D 53 44 4F 53 35 2E 30 MSDOS5.0;
  • 00 02 – количество байт в секторе (обычно 512);
  • 1 байт – количество секторов в кластере;
  • 2 байта – количество резервных секторов.

Кроме того, загрузочный сектор содержит следующую важную информацию:

  • 0x10 (1 байт) – количество таблиц FAT (обычно 2);
  • 0x20 (4 байта) – количество секторов на диске;
  • 0x2С (4 байта) – номер кластера корневого каталога;
  • 0x47 (11 байт) – метка тома;
  • 0x1FE (2 байта) – сигнатура загрузочного сектора ( 55 AA ).


Сектор информации файловой системы содержит:

  • 0x00 (4 байта) – сигнатура ( 52 52 61 41 );
  • 0x1E4 (4 байта) – сигнатура ( 72 72 41 61 );
  • 0x1E8 (4 байта) – количество свободных кластеров, -1 если не известно;
  • 0x1EС (4 байта) – номер последнего записанного кластера;
  • 0x1FE (2 байта) – сигнатура ( 55 AA ).


Таблица FAT содержит информацию о состоянии каждого кластера на диске. Младшие 2 байт таблицы FAT хранят F8 FF FF 0F FF FF FF FF (что соответствует состоянию кластеров 0 и 1, физически отсутствующих). Далее состояние каждого кластера содержит номер кластера, в котором продолжается текущий файл или следующую информацию:

  • 00 00 00 00 – кластер свободен;
  • FF FF FF 0F – конец текущего файла.


Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;


Корневой каталог содержит набор 32-битных записей информации о каждом файле, содержащих следующую информацию:

  • 8 байт – имя файла;
  • 3 байта – расширение файла;
  • 1 байт – атрибут файла:
  • 1 байт – зарезервирован;
  • 1 байт – время создания (миллисекунды) (число от 0 до 199);
  • 2 байта – время создания (с точностью до 2с):
  • 2 байта – дата создания:
  • 2 байта – дата последнего доступа;
  • 2 байта – старшие 2 байта начального кластера;
  • 2 байта – время последней модификации;
  • 2 байта – дата последней модификации;
  • 2 байта – младшие 2 байта начального кластера;
  • 4 байта – размер файла (в байтах).


В случае работы с длинными именами файлов (включая русские имена) кодировка имени файла производится в системе кодировки UTF-16. При этого для кодирования каждого символа отводится 2 байта. При этом имя файла записывается в виде следующей структуры:

  • 1 байт последовательности;
  • 10 байт содержат младшие 5 символов имени файла;
  • 1 байт атрибут;
  • 1 байт резервный;
  • 1 байт – контрольная сумма имени DOS;
  • 12 байт содержат младшие 3 символа имени файла;
  • 2 байта – номер первого кластера;
  • остальные символы длинного имени.

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

Работа с файлами в языке Си

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

Когда поток открывается для ввода-вывода, он связывается со стандартной структурой типа FILE , которая определена в stdio.h . Структура FILE содержит необходимую информацию о файле.

Открытие файла осуществляется с помощью функции fopen() , которая возвращает указатель на структуру типа FILE , который можно использовать для последующих операций с файлом.

  • "r" — открыть файл для чтения (файл должен существовать);
  • "w" — открыть пустой файл для записи; если файл существует, то его содержимое теряется;
  • "a" — открыть файл для записи в конец (для добавления); файл создается, если он не существует;
  • "r+" — открыть файл для чтения и записи (файл должен существовать);
  • "w+" — открыть пустой файл для чтения и записи; если файл существует, то его содержимое теряется;
  • "a+" — открыть файл для чтения и дополнения, если файл не существует, то он создаётся.

Функция fclose() закрывает поток или потоки, связанные с открытыми при помощи функции fopen() файлами. Закрываемый поток определяется аргументом функции fclose() .

Возвращаемое значение: значение 0, если поток успешно закрыт; константа EOF , если произошла ошибка.

Чтение символа из файла:


Аргументом функции является указатель на поток типа FILE . Функция возвращает код считанного символа. Если достигнут конец файла или возникла ошибка, возвращается константа EOF .

Запись символа в файл:

Аргументами функции являются символ и указатель на поток типа FILE . Функция возвращает код считанного символа.

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

Функции fgets() и fputs() предназначены для ввода-вывода строк, они являются аналогами функций gets() и puts() для работы с файлами.


Копирует строку в поток с текущей позиции. Завершающий нуль- символ не копируется.
Пример Ввести число и сохранить его в файле s1.txt. Считать число из файла s1.txt, увеличить его на 3 и сохранить в файле s2.txt.

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