Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация 
V
    Опции темы
Xenon
Дата 9.12.2006, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Нигде не могу найти нормальной  документации, как это реализовать на С++.
В поиске посылают либо в MFC, либо в boost smile В инете нашел только голые примеры без туторилов и объяснений как и что. То есть самого принципа сериализации/десериализаци не описывается.
Может кто видел статью подобную? smile


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 9.12.2006, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Xenon @  9.12.2006,  22:14 Найти цитируемый пост)
То есть самого принципа сериализации/десериализаци не описывается.

Принципы зависят от реализации.
http://en.wikipedia.org/wiki/Serialization
PM MAIL WWW   Вверх
SaDFromSpb
Дата 9.12.2006, 21:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 263
Регистрация: 5.4.2006
Где: Санкт-Петербург

Репутация: 3
Всего: 3



Xenon, Так ее суть в том, чтобы все члены данные засунуть в непрерывный кусок памяти по порядочку, а потом их достать от туда (если речь идет о сериализации в память или в двоичный файл). Что тут, собственно, такого? Зачем что-то искать? Даже на Java, на сколько я знаю, нет встроенного решения. Это всегда вручную делается. (Хотя я могу ошибаться)

Это сообщение отредактировал(а) SaDFromSpb - 9.12.2006, 21:26


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Xenon
Дата 9.12.2006, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



SaDFromSpb, ну в MFC есть Archive, в С++ можно подклчить Boost - это уже, так сказать, костыли помощи smile

Daevaorn, у меня просто имеется вектор указателей на объекты классов, в которых есть поля типа string. Мне нужно каким-то образом это в бинаромном виде сохранить, а потом иметь возможность восстановить(прочитать).


--------------------
user posted image  
PM MAIL   Вверх
Daevaorn
Дата 9.12.2006, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(Xenon @  9.12.2006,  23:09 Найти цитируемый пост)
у меня просто имеется вектор указателей на объекты классов, в которых есть поля типа string. Мне нужно каким-то образом это в бинаромном виде сохранить, а потом иметь возможность восстановить(прочитать). 

boost::serialization - самый быстрый(в интеграции) и простой способ
PM MAIL WWW   Вверх
Xenon
Дата 9.12.2006, 22:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Daevaorn, а если самому? smile Просто чтобы понять концепцию, я так понимаю, нужно самому написать smile
А нет по boost`у хелпа на русском?


--------------------
user posted image  
PM MAIL   Вверх
WERITAS
Дата 9.12.2006, 22:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


********
**


Профиль
Группа: Участник
Сообщений: 582
Регистрация: 2.5.2005
Где: Москва

Репутация: нет
Всего: 5



Цитата
я так понимаю, нужно самому написать 

Функцию Serialiaze ты сам будешь писать


--------------------
Арт-менеджер клуба, разрешивший концерт Алексея Глызина, уволен с формулировкой "Мудак"
PM MAIL   Вверх
zabivator
Дата 10.12.2006, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 7.6.2006
Где: нск

Репутация: 1
Всего: 2



Сериализация - тема очень интересная, хорошей общей обзорной статьи не встречал. По-моему, эту часть языка ооочень неплохо было бы стандартизировать. Ай! Ногами не пинать, сам могу примеров пачку придумать, для которых стандарт фиг придумаешь.
--------------------
#include <zabivator>int main( int, char * [] ){   while( Zabivator::жив() ) Zabivator::моск()++;   return 0;}
PM MAIL WWW ICQ   Вверх
Любитель
Дата 11.12.2006, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Xenon, юзай буст - не ошибёшься. Возможностей в буст::сериализейшен куча, даже если сейчас все не будешь использовать - потом оценишь. Плюс великолепный дизайн и удобство использования. Там достаточно понятные туториалы (хоть и на инглише).


--------------------
PM MAIL ICQ Skype   Вверх
Xenon
Дата 11.12.2006, 17:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Любитель, просто мне казалось, что это будет забиванием гвоздей микроскопом smile
А по бусту есть русский мануал?


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 11.12.2006, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Xenon @ 9.12.2006,  21:09)
у меня просто имеется вектор указателей на объекты классов, в которых есть поля типа string. Мне нужно каким-то образом это в бинаромном виде сохранить, а потом иметь возможность восстановить(прочитать).

В принципе если хочешь сделать сам, то это не так уж сложно.
Если ты знаешь (можно константу какую-нибудь в начале записать) какие классы у тебя в векторе и какие в них данные, то:
запись
- пишешь размер вектора = х
- for (int i=0; i<x; i++) {
    - пишешь по очереди все статические данные
    - пишешь длину строки
    - пишешь саму строку
}
чтение
- читаешь размер вектора, создаёшь его
- for (int i=0; i<x; i++) {
    - читаешь по очереди все статические данные
    - читаешь длину строки, удлиняешь строку в классе до нужного размера
    - читаешь саму строку
}



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Xenon
Дата 11.12.2006, 19:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



nickless, у меня даже статики нет, только string поля.
Вот, чтобы проще было (код класса, адресса на объекты которого хранятся в деке:
Код

class Calbum
{
    friend class Cmanager;
private:
    int year;
    string genre,artist,title;
    Calbum(){}
    Calbum(int _year, string _genre, string _artist, string _title):year(_year),genre(_genre),artist(_artist),title(_title){}
    ~Calbum(){}
};

А двунаправленный список объявлен так в классе Cmanager:
Код

std::deque<Calbum*> album_list;



--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 11.12.2006, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Ну вот и добавь туда что-то вроде save_to_file(std::ofstream&) и Calbum(const std::ifstream&), которые пишут/читают year, потом длину genre, сам genre, длину artist, сам artist ...
Потом останется только записать кол-во элементов в deque и пройтись по нему итератором


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Xenon
Дата 11.12.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



nickless, я только думаю ... Эти все данные представить в виде структуры, или просто подряд писать и все? И как лучше: записать размеры всех переменных, потом само содержимое, либо по-очередно размер/содержимое?


--------------------
user posted image  
PM MAIL   Вверх
JackYF
Дата 11.12.2006, 21:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Xenon, мое мнение - поочередно размер/содержимое. Получится скромненькая структурка.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
nickless
Дата 11.12.2006, 22:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Xenon, делай как тебе удобнее, если писать сначала размер всех переменных, можно и структуру сделать и назвать "CalbumHeader", но ИМХО не стоит оно того, у тебя статических переменных то почти нет.

Цитата(JackYF @ 11.12.2006, 20:31)
мое мнение - поочередно размер/содержимое

поддерживаю


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Вот написал такой бред - вылетает на втором write с ошибкой доступа ... Где я туплю активно?
Код

void save ()
{
    cout << "Enter path to file: ";
    cin.getline(path,256);
    ofstream file;
    file.open(path,std::ios::binary | std::ios::out);
    if(!file)
    {
        throw ("Could not open path");
    }
    for (int i=0;i<album_list.size();i++)
    {
        file.write(reinterpret_cast<char*>(&album_list[i]->year),sizeof(int));
        file.write(reinterpret_cast<char*>(album_list[i]->artist.size()),sizeof(int));
        file.write(album_list[i]->artist.c_str(),sizeof(char)*(album_list[i]->artist.size()));
        file.write(reinterpret_cast<char*>(album_list[i]->genre.size()),sizeof(int));
        file.write(album_list[i]->genre.c_str(),sizeof(char)*(album_list[i]->genre.size()));
        file.write(reinterpret_cast<char*>(album_list[i]->title.size()),sizeof(int));
        file.write(album_list[i]->title.c_str(),sizeof(char)*(album_list[i]->title.size()));
    }
}




--------------------
user posted image  
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Сдается мне, что проблема в том, что size() для string размер возвращает в size_t, а нужен int ...


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 12.12.2006, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Xenon @ 11.12.2006,  23:18)
Где я туплю активно?

Вот тут:
Цитата(Xenon @ 11.12.2006,  23:18)
Код

        file.write(reinterpret_cast<char*>(album_list[i]->artist.size()),sizeof(int));

Ты интерпретируешь размер строки как указатель, надо примерно так:
Код

        int tmp = album_list[i]->artist.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->artist.c_str(),sizeof(char)*(album_list[i]->artist.size()));

        tmp = album_list[i]->genre.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->genre.c_str(),sizeof(char)*(album_list[i]->genre.size()));

        tmp = album_list[i]->title.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->title.c_str(),sizeof(char)*(album_list[i]->title.size()));



--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



А без лишних переменных?

Добавлено @ 01:08 
и можно потолковее это сделать? А то выглядить достаточно громоздко smile


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 12.12.2006, 01:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Без переменных имхо не получится, write() требует указатель, а для этого нужна переменная.
Можно только что через operator<< попробовать, но он вроде только в текстовом модусе работает.

edit:
Да, выглядит не очень  smile 
Если все размеры записать в структуру, то reinterpret_cast потребуется только один раз, но появится лишняя структура... 

Это сообщение отредактировал(а) nickless - 12.12.2006, 01:22


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 01:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



nickless, жаль smile ну а что поделать.
Спасибо smile


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 12.12.2006, 01:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Всегда пожалуйста  smile 


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
satrap
Дата 12.12.2006, 01:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 18
Регистрация: 29.11.2006

Репутация: нет
Всего: 1



-- cut --

Это сообщение отредактировал(а) satrap - 23.1.2007, 21:24
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



nickless, а считывать как? Столкнулся просто с проблемой ... Я читаю файл пока не достигну конца. В начале цикла я создаю переменные, которые мне нужно считать.
Код

string genre,title,artist;
int year,size_g,size_t,size_a;


Потом начинаю читать:
Код

file.read(reinterpret_cast<char*>(&year),sizeof(int)); //Год считываем
file.read(reinterpret_cast<char*>(&size_a),sizeof(int)); //Считываем размер поля artist
file.read(reinterpret_cast<char*>(/*А тут чего?*/),size_a); //Вот что делать


Придется создать переменную buf, типа char, в нее считывать данные, а потом присваивать полю artist и т.д?


--------------------
user posted image  
PM MAIL   Вверх
Oleg_Ci
Дата 12.12.2006, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Цитата
file.read(reinterpret_cast<char*>(/*А тут чего?*/),size_a); //Вот что делать
Так может ?
Код

genre.resize( size_a ); // +1 ?
file.read(reinterpret_cast<char*>( genre.c_str() ),size_a);

PM MAIL   Вверх
JackYF
Дата 12.12.2006, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Олег4, не пойдет.
std::string::c_str() возвращает const char*. Читать в прямо в строку не получится.
Да и нельзя. Придется использовать буфера.


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Oleg_Ci
Дата 12.12.2006, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



А, ну тогда так
Код

genre.resize( size_a ); // +1 ?
file.read(reinterpret_cast<char*>( &genre[0] ),size_a);

Цитата(JackYF @  12.12.2006,  19:38 Найти цитируемый пост)
Да и нельзя. Придется использовать буфера.

Может не красиво или всё-таки опасно ?
Вроде я понимаю что так можно.
PM MAIL   Вверх
JackYF
Дата 12.12.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Опасно. У меня был случай, когда std::string не был цельным куском памяти  smile .


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Romikgy
Дата 12.12.2006, 17:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Олег4 @  12.12.2006,  15:28 Найти цитируемый пост)
genre.resize( size_a ); // +1 ?
file.read(reinterpret_cast<char*>( genre.c_str() ),size_a);

имхо данный код корректен

Цитата(JackYF @  12.12.2006,  16:08 Найти цитируемый пост)
У меня был случай, когда std::string не был цельным куском памяти

это смотря что делаешь со строкой, хотя по стандартам такого быть не должно smile 


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
JackYF
Дата 12.12.2006, 17:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



file.read(reinterpret_cast<char*>( genre.c_str() ),size_a);

Ты попытаешься изменить константные данные! Корректно?

Цитата(Romikgy @  12.12.2006,  17:21 Найти цитируемый пост)
это смотря что делаешь со строкой, хотя по стандартам такого быть не должно smile  

По-моему, стандартом это гарантируется только для вектора.



--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Romikgy
Дата 12.12.2006, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(JackYF @  12.12.2006,  16:24 Найти цитируемый пост)
Ты попытаешься изменить константные данные! Корректно?

в данном случае 
Цитата(JackYF @  12.12.2006,  16:24 Найти цитируемый пост)
c_str()

возвращает указатель на буфер хранящий строку в классе!
т.к. память под него выделена , ничего криминального в этом коде нет!
однако по стандартам С++ эти действия не совсем хороши, ибо на это не задумывался класс стринг!
(но и не смертельно!)

Цитата(JackYF @  12.12.2006,  16:24 Найти цитируемый пост)
стандартом это гарантируется только для вектора.

что это?
то что вектор будет расположен в памяти последовательно?  


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Любитель
Дата 12.12.2006, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



Он вовсе не обязан быть цельным куском.


--------------------
PM MAIL ICQ Skype   Вверх
JackYF
Дата 12.12.2006, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: 18
Всего: 162



Любитель, что?
Данные вектора(0 -- size()-1) не обязаны быть цельным куском? 


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Любитель
Дата 12.12.2006, 18:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



JackYF, не заметил третью страницу  smile  Речь про std::string


--------------------
PM MAIL ICQ Skype   Вверх
Xenon
Дата 12.12.2006, 18:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Любитель, я уже было подумал, что я тупой smile)

Значит нет нормального выхода?


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 12.12.2006, 19:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Если string действительно не обязан быть одним куском, то пожалуй на прямую записать туда чего-нибудь не получится, да и нехорошо это как-то, в приватные переменные в наглую писать  smile
Кроме как через промежуточный буффер, можно еще посимвольно читать, но медленно наверно будет. Если в строке нет нулей (что в принципе нормально  smile ), то можно в принципе записать в файл 0 после строки и потом прочитать с помощью getline(file, str, 0), но точно не знаю как он себя на бинарных файлах поведёт.

edit
У меня (gcc, линь) вот так: 
Код
        getline(file, album_list[i]->artist, static_cast<char>(0));
        getline(file, album_list[i]->genre, static_cast<char>(0));
        getline(file, album_list[i]->title, static_cast<char>(0));
 нормально работает

Это сообщение отредактировал(а) nickless - 12.12.2006, 19:33


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Oleg_Ci
Дата 12.12.2006, 19:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Friend
**


Профиль
Группа: Участник
Сообщений: 485
Регистрация: 28.5.2006
Где: Новосиб.обл.

Репутация: 3
Всего: 30



Цитата(JackYF @  12.12.2006,  20:08 Найти цитируемый пост)
Опасно. У меня был случай, когда std::string не был цельным куском памяти

Обалдеть просто smile 
я и незнал этого
PM MAIL   Вверх
Xenon
Дата 12.12.2006, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Ну не понимаю я что за занос на виражах, правильно же теперь уж все делаю (несмертельно)
Код

void open()
{
    cout << "Enter path to file: ";
    cin.getline(path,256);
    ifstream file;
    file.open(path,std::ios::binary);
    if (!file)
    {
        throw ("Could not open file");
    }
    while (!file.eof())
    {
        string genre,title,artist;
        int year,size_g,size_t,size_a;
        file.read(reinterpret_cast<char*>(&year),sizeof(int));
        file.read(reinterpret_cast<char*>(&size_a),sizeof(int));
        artist.resize(size_a);
        file.read(reinterpret_cast<char*>(&artist[0]),size_a);
        file.read(reinterpret_cast<char*>(&size_g),sizeof(int));
        genre.resize(size_g);
        file.read(reinterpret_cast<char*>(&genre[0]),size_g);
        file.read(reinterpret_cast<char*>(&size_t),sizeof(int));
        title.resize(size_t);
        file.read(reinterpret_cast<char*>(&title[0]),size_g);
        if(file.eof()) 
        {
            break;        
        }    
        album_list.push_back(new Calbum(year, genre, artist, title));
    }
}

Выбрасывает istream на строчке
Код

                    {    // got a character, add it to string
                    ++_Chcount;
                    *_Str++ = _Traits::to_char_type(_Meta);
                    }



Сохранял данные так:
Код
void save ()
{
    cout << "Enter path to file: ";
    cin.getline(path,256);
    ofstream file;
    file.open(path,std::ios::binary | std::ios::out);
    if(!file)
    {
        throw ("Could not open path");
    }
    for (int i=0;i<album_list.size();i++)
    {
        file.write(reinterpret_cast<char*>(&album_list[i]->year),sizeof(int));
        int tmp = album_list[i]->artist.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->artist.c_str(),sizeof(char)*(album_list[i]->artist.size()));

        tmp = album_list[i]->genre.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->genre.c_str(),sizeof(char)*(album_list[i]->genre.size()));

        tmp = album_list[i]->title.size();
        file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(album_list[i]->title.c_str(),sizeof(char)*(album_list[i]->title.size()));
    }
    file.close();
}




--------------------
user posted image  
PM MAIL   Вверх
Romikgy
Дата 12.12.2006, 21:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



Цитата(Xenon @  12.12.2006,  20:03 Найти цитируемый пост)
Выбрасывает istream на строчке

от какой инструкции это ?


--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Xenon
Дата 12.12.2006, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



Romikgy, я так и не понял ... судя по всему вообще вылетала на cin.getline ... Чего-то не понял почему, ну да пофиг, главное файл симпортился, но только но одна запись и почему-то у названия альбома отрезаны три буквы.

Добавлено @ 21:39 
Сейчас вообще на отрывании здох (стал активно хрустеть хард) ... эээ


--------------------
user posted image  
PM MAIL   Вверх
nickless
Дата 12.12.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Гентозавр
****


Профиль
Группа: Участник Клуба
Сообщений: 2976
Регистрация: 29.8.2005
Где: Germany

Репутация: 19
Всего: 181



Цитата(Xenon @ 12.12.2006,  20:03)
Код

        file.read(reinterpret_cast<char*>(&size_g),sizeof(int));
        genre.resize(size_g);
        file.read(reinterpret_cast<char*>(&genre[0]),size_g);
        file.read(reinterpret_cast<char*>(&size_t),sizeof(int));
        title.resize(size_t);
        file.read(reinterpret_cast<char*>(&title[0]),size_g);


Ты когда третью строку читаешь, берешь длину второй.


--------------------
user posted image

Real men don't use backups, they post their stuff on a public ftp server and let the rest of the world make copies
- Linus Torvalds
PM MAIL   Вверх
Romikgy
Дата 12.12.2006, 21:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Любитель-программер
****


Профиль
Группа: Участник Клуба
Сообщений: 7326
Регистрация: 11.5.2005
Где: Porto Franco Odes sa

Репутация: 8
Всего: 146



У мя так работает без проблем
Код

#include <cstdlib>
#include <iostream>
#include <fstream.h>
#include <string.h>

using namespace std;

int main(int argc, char *argv[])
{
    ofstream file;
    file.open("C:\\a.str",std::ios::binary | std::ios::out);
    string genre;
    
    genre="HiWorld";
    
    int tmp=genre.size();
    cout<<tmp<<endl;
    cout<<genre<<endl;
    file.write(reinterpret_cast<char*>(&tmp),sizeof(int));
        file.write(genre.c_str(),sizeof(char)*(genre.size()));
    file.close();
    genre="";
    tmp=0;
    cout<<tmp<<endl;
    cout<<genre<<endl;
    ifstream file1;
    
    file1.open("C:\\a.str",std::ios::binary);
    file1.read(reinterpret_cast<char*>(&tmp),sizeof(int));
    genre.resize(tmp);
    file1.read(reinterpret_cast<char*>(&genre[0]),tmp);
    file1.close();
    cout<<tmp<<endl;
    cout<<genre<<endl;
    cin.get();
    //system("PAUSE");
    return EXIT_SUCCESS;
}



--------------------
Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. 
smile

PM   Вверх
Xenon
Дата 12.12.2006, 22:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1529
Регистрация: 12.4.2006

Репутация: 11
Всего: 50



nickless, мля ... Спасибо за хелп smile


--------------------
user posted image  
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1431 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.