| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Массив структур в файл |
| Автор: LordNet 27.9.2005, 21:11 |
| Люди посоветуйти как лутчи произвести ввод/вывод массива структур в файл и из файла? Зарание спасабо!!! |
| Автор: azesmcar 28.9.2005, 08:21 | ||
Что то вроде этого.
|
| Автор: Denn 28.9.2005, 09:40 |
| если в структурах есть указатели, не так все просто. |
| Автор: azesmcar 28.9.2005, 09:42 | ||
А кто говорил про указатели? |
| Автор: Denn 28.9.2005, 12:30 |
| это на тот случай, если у автора есть в структурах указатели, но он их не упамянул. |
| Автор: azesmcar 28.9.2005, 12:35 | ||
В принципе если есть указатели тогда фиг так легко отделаешся...как минимум описание структуры должно быть...универсальную функцию для этого написать будет сложновато...я бы даже сказал очень сложновато... Добавлено @ 12:37 Надо будет пройтись по структуре, выяснить где у нее находятся динамические переменные, а где статические...а потом еще проверить а может динамическая переменная не инициализирована? а вдруг она уже удалена и программа полетит к чертовой матери... Это не на пару строк тема... Добавлено @ 12:40 Пока не представляю как можно выяснить что из себя представляет кусок памяти размером в 4 байта, переменную типа int или указатель...но задача интересная, можно на ней подумать... |
| Автор: Mayk 28.9.2005, 12:59 | ||
Не стоит. Элджер довольно не плохо обдумывал подобное в С++ Библиотеке программиста(оригназв "C++ for real programmers"). Что-либо утешительного Элджер не надумал. |
| Автор: azesmcar 28.9.2005, 15:00 | ||
| Ну почему же? можно поизвращяться... Передать функции write_struct_to_file массив описивающий структуру...например
Но все равно НЕ ИНТЕРЕСНО |
| Автор: np9mi7 30.9.2005, 01:00 | ||||||||||
Если в структуре нет указателей, то самый оптимальный (в смысле скорости) способ записи массива (линейного контейнера) - бинарный, через потоки ввода вывода;
Но тут возникает проблема считывания данных из потока (перед считыванием необходимо знать сколько объектов собираешся считать). Вообще низкоуровневый вывод/вывод в С++ это не то, что необходимо использовать, используй все преимущества потоков ввода вывода, например: Определи в некотором базовом классе две функции: bool ToStream (std::ostream&) const и bool FromStream (const std::istream&);, или (что более красиво), одну перегруженную функцию:
Потом отнаследуй свои структуры (объекты) от данного интерфейса и реализуй его:
тебе необходимо положить линейный контейнер (массив) в поток (файл). Заполняем линейный контейнер:
При работе с объектами в С++ не используй низкоуровневый ввод/вывод - используй потоки ввода/вывода! И забудь про массивы в С++, есть ведь линейные контейнеры! Примечание: методы сериализации специально упрощены, необходимо добавить проверки свойства good () и.т.д. |
| Автор: Mad 30.9.2005, 01:27 | ||||||
Функции работы с потоками достаточно медленны по выполнению (в сравнении с буферизированным вводом/выводом)
опять имеем дело с потерей производительности, простой массив работает гораздо быстрей а вот идея с перегрузкой довольно неплоха (причем тут можно даже с указателями справиться) получиться примерно так :
Правдо всеравно придеться определить все нужные типы структур В добавок можно еще перед самой структурой писать в файл ее тип (или по номеру или по имени) а при считывании проверять |
| Автор: Mayk 30.9.2005, 07:19 | ||||||||||
юзать sizeof(t) не самая лучшая идея - выравнивание данных на диске нам не к чеме, ведь так? А эти #pragma... Ну вообщем имхо они не красивые.
Я тоже оптимизацию люблю Хотя всё же vector достаточно быстр. Ну всё равно не так, как сишный. В с++ realloc нет
Тогда уж лучше pDest[i] = NeedStructType::load(pFile); типа виртуальный конструктор.
Можно поиграться с хэшированием(хэш ф-ция определяется опытным путем).
не самый лучший вариант, но тоже вариант |
| Автор: np9mi7 30.9.2005, 08:07 | ||||
|
| Автор: Mad 30.9.2005, 09:50 |
| np9mi7 По поводу масивов и контейнеров. Векторы - это динамические массивы и они предназначены для оптимизации использования памяти Статические массивы - оптимизация производительности При работе с дин. массивами добавляються дополнительные операции с перераспредилением памяти. По поводу потоков, если ты посмотриш исходный код с++ библиотек, то увидиш, что внутри реализация сделанна через буфурные функции IO, плюс куча кода |
| Автор: np9mi7 30.9.2005, 11:15 | ||
|
| Автор: Mayk 30.9.2005, 12:14 | ||
Надо полагать там, где быстродействие необходимо. Взять хотя бы игрушки. |
| Автор: np9mi7 30.9.2005, 12:43 | ||||||
Mayk, человек утверждает, что:
Самая частая операция применимая к массиву, это что? Правильно - взятие объекта по индексу:
Смотрим реализацию этих операций в векторе:
Где потеря произволительности? |
| Автор: azesmcar 30.9.2005, 14:50 | ||
Ну а ты вроде как утверждаешь что в С++ массивы вообще никому не нужны..всем пора бы про ниx и перейти на STL.. Ты неправ... Привожу пример, ты решил написать шашки??? так что? чтобы хранить доску ты будешь хранить vector из STL??? есть случаи когда имеет смысл использовать STL а есть случаи когда совсем нет... хотя бы не стоит использовать потому что ты включаешь в свой проект нехилую библиотеку шаблонных классов...как никак а это бессмысленно...и очень может быть на нашем пентиуме 4 никакой разницы ты даже не почувствуешь, а вот попиши как я годик на процессоре 8xx с тактовой частотой 70 мегагерц и винтом размером с мою оперативную память...сразу почувствуешь...убрав STL из проекта и переписав его на C я в 2 раза скорость работы увеличил...как тебе??? по моему чувствуется Добавлено @ 14:53 Еще потеря производительности...при использовании массивов в С++ ты пишешь прямо в оперативную память, а в stl за тебя это делает функция...лишний call...еще 50000 таких лишних call-ов и программа начнет работать медленней на несколько секунд... Зависит от задачи, но советовать забыть массивы С++ это слишком... |
| Автор: Earnest 30.9.2005, 15:41 | ||||||
Ну, в общем, не совсем это правда - если говорить о хорошей реализации, STL, например. Если не надо расширять vector, то нет там никаких операций перераспределения памяти. А если надо - что, в C-шном массиве без malloc сможете обойтись? Только все своими ручками придется делать, ошибки плодить, потом отлаживать... Конечно, теоретически какие-то доп. издержки вроде есть. Но по сравнению с каким-нибудь вызовом Windows API это такие крохи, что под микроскопом не разглядишь. Попробуйте смеха ради заменить где-нибудь в реальном коде массив на vector и посмотреть в профайлере. Не думаю, что увидете разницу раньше, чем на 333 месте по времени...
Ничего ты не включаешь, кроме того, что используешь.
там практически все inline - посмотри в профайлере . В том-то и состоит великая мощь шаблонов вообще, и STL в частности, что за потрясающую гибкость ты почти не платишь. "Почти" - потому что увеличивается время компиляции, но и это можно победить с помощью прекомпилированных заголовков. |
| Автор: azesmcar 30.9.2005, 15:53 | ||||
Ну да, а разве я что то другое сказал??? Что-то используешь...что то включаешь...ничего не используешь..ничего не включаешь..логично.
Я бы не сказал что все...все что возможно инлайн...а возможно далеко не все... Я же сказал что конкретно зависит от задачи, стл штука прекрасная, не спорю, но пихать его куда попало все же не стоит...как ни крути а все равно медленней чем с массивами С++...И если использовать СТЛ в конкретной задаче нет смысла то замедлять свою программу даже на какие то 0.000000001 милисекунду не имеет смысла... |
| Автор: np9mi7 30.9.2005, 16:18 |
| azesmcar, учите мат часть и жизнь сразу станет хороша |
| Автор: azesmcar 30.9.2005, 16:27 |
| А я на жизнь не жалуюсь...учить мне много чего не помешает, как и любому другому...но практика все же показывает что я прав... |
| Автор: Mayk 30.9.2005, 16:31 |
| В с++ нет realloc()а. Знаю, знаю, operator= и всё такое, но всегда ли оно надо? А вообще, блин, нашли что сравнивать. vector и массив. не народ, вам что - делать нечего? |
| Автор: Earnest 30.9.2005, 16:31 | ||
| 1) Использование STL ускоряет написание любых программ в разы. 2) Могу представить себе только одну ситуацию, когда нет смысла использовать вектор: если размер массива задан жестко-прежестко константой времени компиляции. И производительность здесь совершенно не при чем - просто в массив можно засунуть то, что в вектор не очень-то положишь - некопируемые smart-указатели, например. Или нужен статический (в смысле контекста) контейнер заданного размера - тогда тоже лучше массив - можно инициализировать списком. Но и в этом случае я бы использовала алгоритмы STL для всяческих хождений по этому массиву - find, sort, for_each, etc, etc - ибо см. п 1) Добавлено @ 16:33
... просто ее мало... |
| Автор: azesmcar 30.9.2005, 16:43 | ||||||
Ну что тут поделаешь...как говориться 7 лет это не время, но срок...
Я тебе привел пример когда программу твой СТЛ не ускоряет...
Выписка из кода, дополнено и исправлено, массив хранит в себе какие то индексы например... Засунь сюда STL и покажи насколько он будет быстрее...и насколько это вообще нужно. Добавлено @ 16:45 точнее говоря обясни мне смысл стл -а в данном примере...зачем впихивать в проект вектор? |
| Автор: Mad 30.9.2005, 17:20 | ||
если ты не расширяеш вектор, то это уже статический массив |