Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Kukstyler
COBOL Is Everywhere
601 / 385 / 75
Регистрация: 02.04.2009
Сообщений: 1,738
#1

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

26.07.2013, 13:02. Просмотров 1172. Ответов 5

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Цитата Сообщение от Kukstyler Посмотреть сообщение
Есть ли разница в performance между этими 2-мя способами работы с файлами?
разница может быть, а может и не быть. зависит от реализации
1
Croessmah
Ушел
Эксперт CЭксперт С++
13557 / 7707 / 872
Регистрация: 27.09.2012
Сообщений: 18,996
Записей в блоге: 3
Завершенные тесты: 1
26.07.2013, 14:00 #3
Разницу между printf/scanf и cout/cin знаем?
Вот такая же, только зеленая для файлов
1
Kukstyler
COBOL Is Everywhere
601 / 385 / 75
Регистрация: 02.04.2009
Сообщений: 1,738
26.07.2013, 14:20  [ТС] #4
Jupiter, спасибо за ответ.
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!

Croessmah, разницу "знать" на моём чайниковом уровне естественно я никак не могу. На данный момент оперирую базовой инфой, что printf/scanf используется с файлами а cout/cin для ввода/вывода в консоль. На счёт "зелёности" - вообще ничего не понял. Было бы хорошо если б Вы, любезно взявшись объяснить мне что-либо, делали это как с дальтоником. Ибо я изначально признался, что именно таковым и являюсь в данном языке программирования.
0
Jupiter
Каратель
Эксперт С++
6561 / 3982 / 227
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
26.07.2013, 14:55 #5
Цитата Сообщение от Kukstyler Посмотреть сообщение
Значит если я правильно понял, при записи я должен указать длинну String, или использовать char. Соответственно при чтении, надо указать длинну String, а в случае с char она и так указана в обявлении?!
В общем случае да, но с String/UnicodeString могут быть свои тонкости, лучше сразу спросите в разделе билдера. Наверняка там есть более удобные средства сериализации String/UnicodeString
1
Kukstyler
COBOL Is Everywhere
601 / 385 / 75
Регистрация: 02.04.2009
Сообщений: 1,738
26.07.2013, 16:21  [ТС] #6
Выходит использовать тип char array (типа: char my_field[50]) Вы не советуете, предполагаю - из за сравнительной сложности организации простого присваивания некой строки символов (нужны спец функции и/или циклы)?!
Задам вопрос в указанном Вами разделе.

Благодарю за помощь!
0
26.07.2013, 16:21
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.07.2013, 16:21
Привет! Вот еще темы с ответами:

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

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

Запись в бинарный файл и чтение из него массива структур - C++
Ребята, выручайте. Огромная проблема с записью и с чтением структуры из бинарного файла. Помогите кто чем может. void bin_w() { int...

[Файлы] Запись-чтение-запись. Почему не прокатывает? - C++
Сначала записываю в файл &quot;а&quot; запись &quot;makulatura&quot;, потом читаю ее в строку h. Все ок. Но потом когда открываю файл &quot;a&quot; опять для записи с...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.