Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
1

Запись/чтение структур (файлы) + разница между FILE * и <fstream>

26.07.2013, 13:02. Показов 3662. Ответов 5

Author24 — интернет-сервис помощи студентам
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл конкретных и ясных объяснений по-этому поводу. И т.к. в С++ я пока конкретный чайник (и видать ещё надолго), буду очень признателен если кто-либо сможет объяснить Коболисту всю эту канитель на пальцах...

И так, к делу! Первое, что я так и не понял: возможно ли записать структуру в файл напрямик (прямо структуру а не её поля по-отдельности)?

На пример что-либо в стиле:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
typedef struct _REG
{
 UnicodeString TEXTO;
 int           NUM;
} FR;
 
FR r;
 
FILE* f = fopen("fichero.txt", "wb");
 
r.TEXTO = L"устанавливают характер использования файлов";
r.NUM = 1985;
 
fwrite(r, sizeof(r), 1, f);
 
fclose(f);
В данном случае компилятору не нравится r и он выдаёт ошибку, если не ошибаюсь "parse error".

Нашёл такой вариант:
C++
1
fwrite(&r, sizeof(r), 1, f);
В этом случае всё работает, однако & - это ведь pointer на физ. адрес! Таким образом, в файл записывается адрес структуры, и по этому адресу данные могут быть считаны только до закрытия приложения (если закрыть и вновь открыть прогу, по данному адресу естественно этих данных уже нет и прога выдаёт ошибку).

Нашёл ещё один вариант:

C++
1
fprintf(f,"%s%d",r.TEXTO,r.NUM);
На запить он работает, и судя по всему запись производится правильно. Однако при чтении файла этим-же способом:

C++
1
2
3
4
5
6
7
FILE* f = fopen("fichero.txt", "rb");
 
fscanf(f,"%s%d",r.TEXTO,r.NUM);
 
Edit1->Text=r.TEXTO+IntToStr(r.NUM);
 
fclose(f);
Bыдаётся ошибка "Access violation. Write of address 0x00000000"...

Помимо всего этого, я так и нигде не нашёл разницу использования библиотеки <fstream> и объекта FILE. Предполагаю (хоть и может несу чушь), что FILE - это чисто Си, а <fstream> - это уже "тунинг" в С++. Правильно ли это?
И потом, когда используется один вариант а когда второй? Есть ли разница в performance между этими 2-мя способами работы с файлами? Или методы из <fstream> базируется (наследуют) всё те-же методы используемые с FILE?

Заранее спасибо за ответы.


П.С. Начав изучение С++ (совсем недавно) я на собственной шкуре понял, чем и насколько COBOL на самом деле лучше в работе со строками, массивами, структурами и файлами...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.07.2013, 13:02
Ответы с готовыми решениями:

Файлы FILE и fstream
Подскажите, пожалуйста. В большинстве примеров и прочей не сильно официальной литературе при...

fstream не работает и чтение и запись
Добрый день! Не пойму, почему введение функции getline становится причиной того, что запись в файл...

Класс, производный от fstream, чтение и запись
Всем доброго времени суток. у меня есть класс, производный от fstream class Clist : public...

Запись/чтение структуры через fstream
Доброго времени суток! у меня есть несколько вопросов по поводу файловых потоков. 1. Как можно...

5
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2013, 13:57 2
Цитата Сообщение от Kukstyler Посмотреть сообщение
Таким образом, в файл записывается адрес структуры,
нет, в файл записываются поля структуры

Добавлено через 1 минуту
Цитата Сообщение от Kukstyler Посмотреть сообщение
На запить он работает, и судя по всему запись производится правильно. Однако при чтении файла этим-же способом:
а откуда ему знать какой размер у строки?

Добавлено через 39 секунд
Цитата Сообщение от Kukstyler Посмотреть сообщение
Помимо всего этого, я так и нигде не нашёл разницу использования библиотеки <fstream> и объекта FILE. Предполагаю (хоть и может несу чушь), что FILE - это чисто Си, а <fstream> - это уже "тунинг" в С++. Правильно ли это?
правильно

Цитата Сообщение от Kukstyler Посмотреть сообщение
И потом, когда используется один вариант а когда второй?
кола или пепси, книга или фильм?

Цитата Сообщение от Kukstyler Посмотреть сообщение
Есть ли разница в performance между этими 2-мя способами работы с файлами?
разница может быть, а может и не быть. зависит от реализации
2
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
26.07.2013, 14:00 3
Разницу между printf/scanf и cout/cin знаем?
Вот такая же, только зеленая для файлов
2
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
26.07.2013, 14:20  [ТС] 4
Jupiter, спасибо за ответ.
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!

Croessmah, разницу "знать" на моём чайниковом уровне естественно я никак не могу. На данный момент оперирую базовой инфой, что printf/scanf используется с файлами а cout/cin для ввода/вывода в консоль. На счёт "зелёности" - вообще ничего не понял. Было бы хорошо если б Вы, любезно взявшись объяснить мне что-либо, делали это как с дальтоником. Ибо я изначально признался, что именно таковым и являюсь в данном языке программирования.
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
26.07.2013, 14:55 5
Цитата Сообщение от Kukstyler Посмотреть сообщение
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!
В общем случае да, но с String/UnicodeString могут быть свои тонкости, лучше сразу спросите в разделе билдера. Наверняка там есть более удобные средства сериализации String/UnicodeString
1
1246 / 858 / 265
Регистрация: 02.04.2009
Сообщений: 3,255
26.07.2013, 16:21  [ТС] 6
Выходит использовать тип char array (типа: char my_field[50]) Вы не советуете, предполагаю - из за сравнительной сложности организации простого присваивания некой строки символов (нужны спец функции и/или циклы)?!
Задам вопрос в указанном Вами разделе.

Благодарю за помощь!
0
26.07.2013, 16:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.07.2013, 16:21
Помогаю со студенческими работами здесь

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

Запись и чтение структур данных
Изучаю структуры данных в C++. Решил написать программу, которая просто получает данные для...

Clipboard (запись/чтение) массива структур
Привет, форумчане! Прошу консультации по работе с буфером обмена Windows. Нужно корректно...

Запись/чтение массива структур в бинарный файл
#include &lt;iostream&gt; #include &lt;fstream&gt; using namespace std; struct test { int x; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru