Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Kukstyler
COBOL Expert
 Аватар для Kukstyler
356 / 138 / 7
Регистрация: 02.04.2009
Сообщений: 665
26.07.2013, 13:02     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #1
Всем привет. Порыскал по форуму, погуглил... Решения есть, но они не ясны (что, почему да как) и не все работают. Однако, я так и не нашёл конкретных и ясных объяснений по-этому поводу. И т.к. в С++ я пока конкретный чайник (и видать ещё надолго), буду очень признателен если кто-либо сможет объяснить Коболисту всю эту канитель на пальцах...

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

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

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 на самом деле лучше в работе со строками, массивами, структурами и файлами...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.07.2013, 13:02     Запись/чтение структур (файлы) + разница между FILE * и <fstream>
Посмотрите здесь:

Error 1 fatal error C1083: Cannot open include file: 'fstream.h': No such file or directory C++
запись/чтение структуры через fstream C++
C++ Разница между массивом структур и очередью
C++ Clipboard (запись/чтение) массива структур
C++ fstream не работает и чтение и запись
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2013, 13:57     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #2
Цитата Сообщение от Kukstyler Посмотреть сообщение
Таким образом, в файл записывается адрес структуры,
нет, в файл записываются поля структуры

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

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

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

Цитата Сообщение от Kukstyler Посмотреть сообщение
Есть ли разница в performance между этими 2-мя способами работы с файлами?
разница может быть, а может и не быть. зависит от реализации
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,917
Записей в блоге: 2
Завершенные тесты: 1
26.07.2013, 14:00     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #3
Разницу между printf/scanf и cout/cin знаем?
Вот такая же, только зеленая для файлов
Kukstyler
COBOL Expert
 Аватар для Kukstyler
356 / 138 / 7
Регистрация: 02.04.2009
Сообщений: 665
26.07.2013, 14:20  [ТС]     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #4
Jupiter, спасибо за ответ.
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!

Croessmah, разницу "знать" на моём чайниковом уровне естественно я никак не могу. На данный момент оперирую базовой инфой, что printf/scanf используется с файлами а cout/cin для ввода/вывода в консоль. На счёт "зелёности" - вообще ничего не понял. Было бы хорошо если б Вы, любезно взявшись объяснить мне что-либо, делали это как с дальтоником. Ибо я изначально признался, что именно таковым и являюсь в данном языке программирования.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2013, 14:55     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #5
Цитата Сообщение от Kukstyler Посмотреть сообщение
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!
В общем случае да, но с String/UnicodeString могут быть свои тонкости, лучше сразу спросите в разделе билдера. Наверняка там есть более удобные средства сериализации String/UnicodeString
Kukstyler
COBOL Expert
 Аватар для Kukstyler
356 / 138 / 7
Регистрация: 02.04.2009
Сообщений: 665
26.07.2013, 16:21  [ТС]     Запись/чтение структур (файлы) + разница между FILE * и <fstream> #6
Выходит использовать тип char array (типа: char my_field[50]) Вы не советуете, предполагаю - из за сравнительной сложности организации простого присваивания некой строки символов (нужны спец функции и/или циклы)?!
Задам вопрос в указанном Вами разделе.

Благодарю за помощь!
Yandex
Объявления
26.07.2013, 16:21     Запись/чтение структур (файлы) + разница между FILE * и <fstream>
Ответ Создать тему

Метки
запись/чтение структур, разница file * <fstream>
Опции темы

Текущее время: 20:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru