![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
LordNet |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 60 Регистрация: 23.3.2005 Репутация: нет Всего: нет |
Люди посоветуйти как лутчи произвести ввод/вывод массива структур в файл и из файла?
Зарание спасабо!!! |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Что то вроде этого.
|
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
если в структурах есть указатели, не так все просто.
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А кто говорил про указатели? |
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
это на тот случай, если у автора есть в структурах указатели, но он их не упамянул.
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
В принципе если есть указатели тогда фиг так легко отделаешся...как минимум описание структуры должно быть...универсальную функцию для этого написать будет сложновато...я бы даже сказал очень сложновато... Добавлено @ 12:37 Надо будет пройтись по структуре, выяснить где у нее находятся динамические переменные, а где статические...а потом еще проверить а может динамическая переменная не инициализирована? а вдруг она уже удалена и программа полетит к чертовой матери... Это не на пару строк тема... Добавлено @ 12:40 Пока не представляю как можно выяснить что из себя представляет кусок памяти размером в 4 байта, переменную типа int или указатель...но задача интересная, можно на ней подумать... |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Не стоит. Элджер довольно не плохо обдумывал подобное в С++ Библиотеке программиста(оригназв "C++ for real programmers"). Что-либо утешительного Элджер не надумал. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну почему же? можно поизвращяться...
Передать функции write_struct_to_file массив описивающий структуру...например
Но все равно НЕ ИНТЕРЕСНО ![]() |
|||
|
||||
np9mi7 |
|
||||||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Если в структуре нет указателей, то самый оптимальный (в смысле скорости) способ записи массива (линейного контейнера) - бинарный, через потоки ввода вывода;
Но тут возникает проблема считывания данных из потока (перед считыванием необходимо знать сколько объектов собираешся считать). Вообще низкоуровневый вывод/вывод в С++ это не то, что необходимо использовать, используй все преимущества потоков ввода вывода, например: Определи в некотором базовом классе две функции: bool ToStream (std::ostream&) const и bool FromStream (const std::istream&);, или (что более красиво), одну перегруженную функцию:
Потом отнаследуй свои структуры (объекты) от данного интерфейса и реализуй его:
тебе необходимо положить линейный контейнер (массив) в поток (файл). Заполняем линейный контейнер:
При работе с объектами в С++ не используй низкоуровневый ввод/вывод - используй потоки ввода/вывода! И забудь про массивы в С++, есть ведь линейные контейнеры! Примечание: методы сериализации специально упрощены, необходимо добавить проверки свойства good () и.т.д. |
||||||||||
|
|||||||||||
Mad |
|
||||||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
Функции работы с потоками достаточно медленны по выполнению (в сравнении с буферизированным вводом/выводом) ![]()
опять имеем дело с потерей производительности, простой массив работает гораздо быстрей ![]() а вот идея с перегрузкой довольно неплоха (причем тут можно даже с указателями справиться) получиться примерно так :
Правдо всеравно придеться определить все нужные типы структур ![]() В добавок можно еще перед самой структурой писать в файл ее тип (или по номеру или по имени) а при считывании проверять Это сообщение отредактировал(а) Mad - 30.9.2005, 01:28 |
||||||
|
|||||||
Mayk |
|
||||||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
юзать sizeof(t) не самая лучшая идея - выравнивание данных на диске нам не к чеме, ведь так? А эти #pragma... Ну вообщем имхо они не красивые.
Я тоже оптимизацию люблю ![]() Хотя всё же vector достаточно быстр. Ну всё равно не так, как сишный. В с++ realloc нет ![]()
Тогда уж лучше pDest[i] = NeedStructType::load(pFile); типа виртуальный конструктор.
Можно поиграться с хэшированием(хэш ф-ция определяется опытным путем).
не самый лучший вариант, но тоже вариант ![]() Это сообщение отредактировал(а) Mayk - 30.9.2005, 07:19 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||||||
|
|||||||||||
np9mi7 |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
||||
|
|||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
np9mi7
По поводу масивов и контейнеров. Векторы - это динамические массивы и они предназначены для оптимизации использования памяти Статические массивы - оптимизация производительности При работе с дин. массивами добавляються дополнительные операции с перераспредилением памяти. По поводу потоков, если ты посмотриш исходный код с++ библиотек, то увидиш, что внутри реализация сделанна через буфурные функции IO, плюс куча кода ![]() |
|||
|
||||
np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
|
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Надо полагать там, где быстродействие необходимо. Взять хотя бы игрушки. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |