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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 5.00
NetMinon
0 / 0 / 0
Регистрация: 16.12.2006
Сообщений: 88
#1

Как записать структуру в файл? - C++

07.01.2008, 05:47. Просмотров 2773. Ответов 13
Метки нет (Все метки)

есть структура
C++
1
2
3
4
5
struct frend
{
   char name[10];
   char tel[10];
};
как записать ее в файл и потом считат соответственно))
заранее благодарен Роман
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.01.2008, 05:47
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как записать структуру в файл? (C++):

Как записать структуру в файл с помощью fstream? - C++
доброго времени суток, нужна ваша помощ. припустим у нас есть структура: struct group { char name; int k; }st; как...

Как записать структуру в бинарный файл одним "блоком" - C++
Как записать структуру в бинарный файл одним "блоком", если в структуре есть private данные? struct MyStruct{ char Name; ...

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

Записать структуру в файл - C++
подскажыте, как записать структару в файл!

Записать структуру в бинарный файл - C++
Всем доброго времени суток. у меня такая проблема, мне нужно перекинуть в бинарный файл структуру. Структуру создала, все сделала. Файл...

Подскажите как из массива записать в структуру? - C++
Подскажите как из массива записать в структуру? #include <stdio.h> #include <stdlib.h> struct DETAILS{ char name; int num; ...

13
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
07.01.2008, 10:05 #2
HI !
C++
1
2
3
4
5
struct friend
{
char name[10];
char tel[10];
};
C++
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
#include <fstream>
using std::ofstream;
using std::ifstream;
 
ostream& operator<<(ostream& os, friend const& v)
{
  os << v.name;
  os << tel.name;
 
  return os;
}
 
ostream& operator>>(ifstream& const is, friend & v)
{
  is >> v.name;
  is >> tel.name;
 
  return is;
}
 
int main()
{
  ifstream in('realfriends.txt');
  friend bestFriend;
  in >> bestFriend;
 
  ofstream out('B#tches_I_dont_wanna_see_anymore.txt');
  friend oldgirlFriend;
  out <<  oldgirlFriend;
}
Вроде так, ну ладно ... пора работать =)

--Igor Soukhov, www.rsdn.ru
0
Snork
Сообщений: n/a
07.01.2008, 13:42 #3
Лучше не работать со структурами вообще. Они и нужны-то только для совместимости со старым кодом :-). Я бы унаследовал класс CFriend от класса, поддерживающего сериализацию (CObject в MFC, например) и переопределил виртуальные ф-ции ввода-вывода. Но это архитектура, а спросить ты, по моему, хотел вот что. Как за один раз кинуть в файл сложный тип данных? Увы, никак. Можно лишь встроенные. Я тоже был разочарован, когда об этом узнал :-{.

Снорк.
McVillain
1 / 1 / 0
Регистрация: 30.04.2007
Сообщений: 226
07.01.2008, 16:12 #4
2Снорк:

> Лучше не работать со структурами вообще.
> Они и нужны-то только для совместимости со старым кодом :-)

не совсем понятно, смайлик относится ко всему утверждению или ко второй фразе? Если 'лучше не работать' написано серьёзно, то это очень спорное утверждение...

Например, есть мнение, что private-данные, для которых есть открытые методы getXXX() и setXXX(), причём set не делает ничего, кроме присваивания, проще объявить public (де-факто они и так открыты). А выбирать между объявлениями 'struct AAA{ ...' и 'class AAA{ public: ...', можно долго...

> Как за один раз кинуть в файл сложный тип данных? Увы, никак.
C++
1
2
3
4
5
fwrite(
    &veryComplexDataStructure, 
    sizeof(veryComplexDataStructure), 
    1,
    file);
Если аккуратно объявить структуру, чтобы она не содержала указателей и не возникало проблем с выравниванием полей -- только в путь!

правда, с указателями возникают проблемы... а уж с классами, содержащими виртуальные функции, и подавно... Но всё это обходится той же сериализацией.
0
Snork
Сообщений: n/a
07.01.2008, 17:30 #5
Уважаемый McVillan! Смайл, естественно, относился ко всему высказыванию, т.к. всеръез такими выражениями, как 'давайте не будем пользоваться структурами' я не кидаюсь. Насчет Get-Set согласен полностью. Надо проектировать классы так, чтобы реального доступа к private- и protected-данным не было. Обычно это достигается следующим образом: пока не спроектированы все методы, разработчику _запрещается_ проектировать член-переменные. (А избавиться от Get-Set-обработки, сидящей в подкорке, все равно сложно:-().

Насчет того, что сложные типы данных не кидаются в файл. Именно указатели я и имел в виду. Вообще-то пример, который нам привели (с полями имя/телефон) указателей не содержит и может быть скинут так, как Вы советуете. НО! Если через пару дней возникнет необходимость сделать связанный список? Или добавить в структуру иные ссылки (под ссылками я разумею все те же указатели на объекты, на которые осуществляется ссылка)? Что тогда? Не проще ли с самого начала делать все как положено?

С уважением - Сергей.
McVillain
1 / 1 / 0
Регистрация: 30.04.2007
Сообщений: 226
08.01.2008, 11:58 #6
> всерьез такими выражениями, как 'давайте не будем
> пользоваться структурами' я не кидаюсь

=)

> Насчет того, что сложные типы данных не кидаются в файл.
> Именно указатели я и имел в виду.

Вариант номер раз. Сделать 'оболочки':
C++
1
2
3
4
5
6
7
8
9
struct Friend
{
    ...
};
 
struct FriendWrapper : Friend
{
   FriendWrapper *link;
};
Вариант номер два. Сериализация.

Вариант номер три. Лично мне он больше всего нравится. Хранить все внешние данные в произвольном (не привязанном, вообще говоря, к используемым структурам данных) ТЕКСТОВОМ формате. Сделать парсер и механизмы порождения таких данных -- и наслаждаться жизнью. Если очень хочется, можно использовать что-нибудь новомодное, к примеру, xml (и потом кричать на всех углах, какие мы современные, как мы используем самые-самые распоследние достижения самых-самых технологий... хотя на поверку это банальный csv, только в другом формате... пардон, отвлёкся.)

Во-первых, такой подход позволяет просматривать и редактировать любые данные текстовым редактором. Во-вторых, внешние данные могут оставаться неизменными при изменении описывающих их структур (все изменения локализуется в парсере и механизме порождения).
0
Snork
Сообщений: n/a
08.01.2008, 13:37 #7
>Вариант номер раз. Сделать 'оболочки':

>struct Friend{ ...};struct FriendWrapper : Friend{ FriendWrapper *link;};

>Вариант номер два. Сериализация.

О чем я и говорил. Факт тот, что или приходится прибегать к наследованию (есть еще вариант с агрегацией), или изначально делать сериализацию (на чем я и настаивал!). Причем сериализация, ИМХО - лучший вариант.

> Вариант номер три. Лично мне он больше всего нравится. Хранить все внешние данные в произвольном (не привязанном, вообще говоря, к используемым структурам данных) ТЕКСТОВОМ формате. Сделать парсер и механизмы порождения таких данных -- и наслаждаться жизнью. Если очень хочется, можно использовать что-нибудь новомодное, к примеру, xml (и потом кричать на всех углах, какие мы современные, как мы используем самые-самые распоследние достижения самых-самых технологий... хотя на поверку это банальный csv, только в другом формате... пардон, отвлёкся.)

А вот про текстовый формат рискну поспорить. Мало того, что он занимает в разы больше места, так еще и обрабатывается дольше. (Необходима конвертация число <-> текст). Заявляю ответственно, что загрузка DSAAgrd-файла (один из самых распространенных форматов по хранению сеток) с числом узлов 300x300 на моем DualPIIIx800 вызывает трехсекундный ступор, в то время как загрузка через COM сервер, который передает данные в бинарном формате осуществляется практически незаметно. Поэтому если данные нужно хранить для реальных систем, а не для красоты - всегда следует предусматривать разростание среднего размера файлов. Вообще-то наш пример в конвертации не нуждается - это ТЕКСТ. Но если этот зародыш телефонной книги забивать данными регулярно, то скоро сам автор поймет, что телефон надо хранить в виде длинного целого. Засим прощаюсь, с уважением Снорк.
Snork
Сообщений: n/a
08.01.2008, 16:01 #8
Тут пришел хороший программист, мы еще подумали вместе и пришли к выводу - можно делать еще так: или наплевать на указатели и кидать их в файл (коряво, но если структура большая - безболезненно), или же включать указатели последними, а в write передовать sizeof(tagMYSTRUCTURE) - n * sizeof(void*), где n - число указателей. Остается открытым вопрос инициализации такой структуры, т.к. если аналогично можно считать данные из файла, то указатели надо генерить вручную. И еще вот что. Если у нас массив структур, а не один экземпляр, то лучше фиктивные значения указателей все же сохранять - тогда можно передавать адрес первой структуры и через буфер сохранять/восстанавливать весь массив за одно чтение/запись. Но вопрос об инициализации указателей остается и в этом случае.

С уважением - Снорк.
McVillain
1 / 1 / 0
Регистрация: 30.04.2007
Сообщений: 226
08.01.2008, 16:52 #9
> А вот про текстовый формат рискну поспорить.

Люблю я это дело!

> ...он занимает в разы больше места...

да

> ...обрабатывается дольше...

да

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

...или использование базы данных. При разрастании объёмов -- очень способствует!

> ...телефон надо хранить в виде длинного целого...

'111-22-33, добавочный 444' -- это какое число?

в рекламах регулярно видел строчки типа 1-800-12345-CALL-NOW... их туда же?

И ещё одно про текст. Недавно мне нужно было перенести (скопировать) несколько таблиц (ну, штук 100 примерно) базы данных с одного сервера на другой. Чего уж проще: backup на одной, restore на другой... Вот только беда: базы создавались с немножко разными опциями... И умная система отказывалась распаковывать 'чужие' файлы. Обмануть её удалось совершенно тривиально: экспорт нужных таблиц в _текстовый_ файл, затем импорт на другой машине. Вот.

И напоследок. Универсальных решений не бывает. Бывают решения, более или менее подходящие для данной задачи.
0
Snork
Сообщений: n/a
08.01.2008, 18:44 #10
>...или использование базы данных. При разрастании объёмов -- очень способствует!

Почему-то разработчики моего формата предпочли не делать базы данных. Это - фактор 'свыше'

>'111-22-33, добавочный 444' -- это какое число?

1112233444 == 0 x 42 4B 55 E4. 8 полубайт == 4 байта == sizeof(DWORD).

>в рекламах регулярно видел строчки типа 1-800-12345-CALL-NOW... их туда же?

180012345 == 0 x 0A BA C5 39. Предлагаю новый форум: как набрать на телефоне 'CALL-NOW!' (Напоминает анекдот про Бивиса, который не смог вызвать Службу 911 - кнопки 'одиннадцать' не нашел ;-))

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

>И напоследок. Универсальных решений не бывает. Бывают решения, более или менее подходящие для данной задачи.

Чем хороши банальности - с ними никто не спорит, а флейм затухает ;-)

С уважением - Снорк.
Snork
Сообщений: n/a
08.01.2008, 18:48 #11
Черт!
>...разростание...
Разрастание, конечно!

Снорк.
McVillain
1 / 1 / 0
Регистрация: 30.04.2007
Сообщений: 226
09.01.2008, 13:49 #12
Ну вот, от структур плавно перетекли к телефонам...

>> '111-22-33, добавочный 444'
> 1112233444

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

> Предлагаю новый форум: как набрать на телефоне 'CALL-NOW!'

мне кажется, что имеются в виду буквы, написанные на кнопочных телефонах... то есть call-now транслируется в 2255-669. А вообще, надо бы всяких заграничных жителей об этом поспрашивать.

> При визуализации телефона разделители можно генерировать по шаблону

то есть как минимум привязывать к телефону шаблон? по крайней мере, один из нескольких вариантов?

С не меньшим уважением.
0
Snork
Сообщений: n/a
09.01.2008, 15:01 #13
>а номеронабирающая программа, наверное, сама всё поймёт и хорошо поставленным синтезированным голосом продиктует последние три цифры девушке на коммутаторе? )

Я думаю, что номера с добавочными цифрами не часто используются для автоматического номеронабирания. Накрайняк, программа 'нажмет' лишние 3 кнопки, что никак не скажется на звонке. Остальное сделает усеръ. А вообще-то про телефонную связь знаю мало, это не ирония, а следствие моего предпочтения не платить за время соединения, пользуясь, в настоящее время, выделенкой.

>мне кажется, что имеются в виду буквы, написанные на кнопочных телефонах... то есть call-now транслируется в 2255-669. А вообще, надо бы всяких заграничных жителей об этом поспрашивать.

Если так - то надо переходить на очень длинное целое;-) бит в 64 где-то... Хотя и думаю до сих пор, что это просто - 'заглушка' для цены. ('Звоните сейчас - и вы услышите, что цены снизились еще больше!!!')

>то есть как минимум привязывать к телефону шаблон? по крайней мере, один из нескольких вариантов?

Вставлять после каждой третьей цифири тире - самый простой вариант. Его можно усложнить по мере надобности.

Со все возрастающим уважением ;-) (этот смайл относится к форме высказывания, но не к содержанию оного), Снорк.
Igor Soukhov
0 / 0 / 0
Регистрация: 06.01.2008
Сообщений: 62
09.01.2008, 15:27 #14
Зашел чито бы поправить свой ответ... так как слово friend зарезервировано в C++ - то имя параметра в операторах нато поменять на friend_ =)

ps: интересные тут форумы =)

--Igor Soukhov, www.rsdn.ru
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2008, 15:27
Привет! Вот еще темы с ответами:

Как правильно считать (записать) структуру из файла? - C++
не хочет правильно читать, вроде пишет, вроде правильно, не уверен. Заранее благодарен за помощь void __fastcall...

Как записать в вектор структуру? Это вообще возможно сделать? - C++
Привет всем! Как записать в вектор структуру? Это вообще возможно сделать? Надо, чтоб первая строка из файла записывалась в вектор,...

Как вынести структуру в отдельный файл - C++
Помогите, пожалуйста. Задали дополнительное задание: вынести структуру в отдельный файл. Я понятия не имею как это делать. #include...

Как открыть бинарный файл, не зная его структуру? - C++
Можно ли как-нибудь открыть бинарный файл, не зная его структуру?


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

Или воспользуйтесь поиском по форуму:
14
Yandex
Объявления
09.01.2008, 15:27
Ответ Создать тему
Опции темы

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