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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сериализация 
V
    Опции темы
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   Вверх
Страницы: (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.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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