![]() |
Модераторы: 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 |
Надо полагать там, где быстродействие необходимо. Взять хотя бы игрушки. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
np9mi7 |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
Mayk, человек утверждает, что:
Самая частая операция применимая к массиву, это что? Правильно - взятие объекта по индексу:
Смотрим реализацию этих операций в векторе:
Где потеря произволительности? Это сообщение отредактировал(а) np9mi7 - 30.9.2005, 12:47 |
||||||
|
|||||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну а ты вроде как утверждаешь что в С++ массивы вообще никому не нужны..всем пора бы про ниx и перейти на STL.. Ты неправ... Привожу пример, ты решил написать шашки??? так что? чтобы хранить доску ты будешь хранить vector из STL??? есть случаи когда имеет смысл использовать STL а есть случаи когда совсем нет... хотя бы не стоит использовать потому что ты включаешь в свой проект нехилую библиотеку шаблонных классов...как никак а это бессмысленно...и очень может быть на нашем пентиуме 4 никакой разницы ты даже не почувствуешь, а вот попиши как я годик на процессоре 8xx с тактовой частотой 70 мегагерц и винтом размером с мою оперативную память...сразу почувствуешь...убрав STL из проекта и переписав его на C я в 2 раза скорость работы увеличил...как тебе??? по моему чувствуется Добавлено @ 14:53 Еще потеря производительности...при использовании массивов в С++ ты пишешь прямо в оперативную память, а в stl за тебя это делает функция...лишний call...еще 50000 таких лишних call-ов и программа начнет работать медленней на несколько секунд... Зависит от задачи, но советовать забыть массивы С++ это слишком... |
|||
|
||||
Earnest |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Ну, в общем, не совсем это правда - если говорить о хорошей реализации, STL, например. Если не надо расширять vector, то нет там никаких операций перераспределения памяти. А если надо - что, в C-шном массиве без malloc сможете обойтись? Только все своими ручками придется делать, ошибки плодить, потом отлаживать... Конечно, теоретически какие-то доп. издержки вроде есть. Но по сравнению с каким-нибудь вызовом Windows API это такие крохи, что под микроскопом не разглядишь. Попробуйте смеха ради заменить где-нибудь в реальном коде массив на vector и посмотреть в профайлере. Не думаю, что увидете разницу раньше, чем на 333 месте по времени...
Ничего ты не включаешь, кроме того, что используешь.
там практически все inline - посмотри в профайлере . В том-то и состоит великая мощь шаблонов вообще, и STL в частности, что за потрясающую гибкость ты почти не платишь. "Почти" - потому что увеличивается время компиляции, но и это можно победить с помощью прекомпилированных заголовков. -------------------- ... |
||||||
|
|||||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну да, а разве я что то другое сказал??? Что-то используешь...что то включаешь...ничего не используешь..ничего не включаешь..логично.
Я бы не сказал что все...все что возможно инлайн...а возможно далеко не все... Я же сказал что конкретно зависит от задачи, стл штука прекрасная, не спорю, но пихать его куда попало все же не стоит...как ни крути а все равно медленней чем с массивами С++...И если использовать СТЛ в конкретной задаче нет смысла то замедлять свою программу даже на какие то 0.000000001 милисекунду не имеет смысла... |
||||
|
|||||
np9mi7 |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 553 Регистрация: 17.8.2003 Где: Volgograd, Russia Репутация: 5 Всего: 10 |
azesmcar, учите мат часть и жизнь сразу станет хороша
![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
А я на жизнь не жалуюсь...учить мне много чего не помешает, как и любому другому...но практика все же показывает что я прав...
|
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
В с++ нет realloc()а. Знаю, знаю, operator= и всё такое, но всегда ли оно надо?
![]() А вообще, блин, нашли что сравнивать. vector и массив. не народ, вам что - делать нечего? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
1) Использование STL ускоряет написание любых программ в разы.
2) Могу представить себе только одну ситуацию, когда нет смысла использовать вектор: если размер массива задан жестко-прежестко константой времени компиляции. И производительность здесь совершенно не при чем - просто в массив можно засунуть то, что в вектор не очень-то положишь - некопируемые smart-указатели, например. Или нужен статический (в смысле контекста) контейнер заданного размера - тогда тоже лучше массив - можно инициализировать списком. Но и в этом случае я бы использовала алгоритмы STL для всяческих хождений по этому массиву - find, sort, for_each, etc, etc - ибо см. п 1) Добавлено @ 16:33
... просто ее мало... ![]() -------------------- ... |
|||
|
||||
azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
Ну что тут поделаешь...как говориться 7 лет это не время, но срок...
Я тебе привел пример когда программу твой СТЛ не ускоряет...
Выписка из кода, дополнено и исправлено, массив хранит в себе какие то индексы например... Засунь сюда STL и покажи насколько он будет быстрее...и насколько это вообще нужно. Добавлено @ 16:45 точнее говоря обясни мне смысл стл -а в данном примере...зачем впихивать в проект вектор? |
||||||
|
|||||||
Mad |
|
|||
Опытный ![]() ![]() Профиль Группа: Эксперт Сообщений: 656 Регистрация: 18.10.2004 Где: Одесса Репутация: 7 Всего: 19 |
если ты не расширяеш вектор, то это уже статический массив ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |