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

Поиск:

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


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

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