Re[3]: <vector> C++
От: Usefur  
Дата: 30.05.11 20:40
Оценка:
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.


FS>Раз кто-то усомнился в том что так можно(а минусов-то понаставили ) — привожу полный код решения.



    vector <Person> pers;

    pers.push_back(Person);

    ofstream out ("E:\\file1.txt", ios::binary);
    int size = pers.size();
    out.write((char*)(&size), 4);
    out.write((char*)&pers[0], pers.size()*sizeof(Person));
    out.close();}

Вот в pers.push_back(Person); что именно из елементов нужно писать?...Чтобы весь класс сохранить в нем.

class Person{

public:
        Person(){}    
        ~Person(){}   
        
        
        string GetFamiliya(){ return persFamiliya;}
        string GetName(){ return persName;}
        string GetData(){ return persData;}
        string GetTelefon(){ return persTelefon;}

        
        void SetFamiliya(string fam){ persFamiliya=fam;}
        void SetName(string name){ persName=name;}
        void SetData(string data){ persData=data;}
        void SetTelefon(string tel){ persTelefon=tel;}

        
        void Print();
        
private:
        string persFamiliya;
        string persName;
        string persData;
        string persTelefon;
        
};
Re[3]: <vector> C++
От: Usefur  
Дата: 30.05.11 20:54
Оценка:
Здравствуйте, Fedor Sumkin, Вы писали:

FS>Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.


FS>Раз кто-то усомнился в том что так можно(а минусов-то понаставили ) — привожу полный код решения.


У меня есть класс Person вот
class Person{

public:
        Person(){}    
        ~Person(){}   
        
        
        string GetFamiliya(){ return persFamiliya;}
        string GetName(){ return persName;}
        string GetData(){ return persData;}
        string GetTelefon(){ return persTelefon;}

        
        void SetFamiliya(string fam){ persFamiliya=fam;}
        void SetName(string name){ persName=name;}
        void SetData(string data){ persData=data;}
        void SetTelefon(string tel){ persTelefon=tel;}

        
        void Print();
        
private:
        string persFamiliya;
        string persName;
        string persData;
        string persTelefon;
        
};


Данные уже вводятся в вектор тут:
string sbuf;
        Person bufPers;
        cout<<endl;
                cout<<Rus("__________Добавление записи о читателе__________\n");
                cout<<Rus("Фамилия: ");
        cin>>sbuf;
        bufPers.SetFamiliya(sbuf);

        cout<<endl
                <<Rus("Имя: ");
        cin>>sbuf;
        bufPers.SetName(sbuf);

        cout<<endl
                <<Rus("Дата рождения: ");
        cin>>sbuf;
        bufPers.SetData(sbuf);

        cout<<endl
                <<Rus("Телефон:");
        cin>>sbuf;
        bufPers.SetTelefon(sbuf);

        pers.push_back(bufPers);
        cout<<Rus("__________Готово!__________\n");
}


То есть, исходя из вашего кода
vector<Person> pers;

    pers.push_back(p);
    pers.push_back(p);

    ofstream out ("data.txt", ios::binary);
    int size = pers.size();
    out.write((char*)(&size), 4);
    out.write((char*)&pers[0], pers.size()*sizeof(Person));
    out.close();


Как записать весь класс в файл, тут pers.push_back(p); запис. Person p = {20, "Martin", "Fowler"};
А что писать чтобы мой клас сохранился?
Re[4]: <vector> C++
От: Usefur  
Дата: 30.05.11 21:20
Оценка:
Да, решил с записью.
Теперь с считыванием:

 vector<Person> pers;
    Person p;
    int size = 0;

    ifstream in("E:\\file1.txt", ios::binary);
    in.read((char*)&size, 4);
    pers.resize(size);

    in.read((char*)&pers[0], size*sizeof(Person));

    for_each(pers.begin(), pers.end(), [](Person p) -> stream {
            cout << "Familiya-" << pers.Familiya << endl;
            cout << "Name-" << pers.Name << endl;
            cout << "Data-" << pers.Data << endl;
        cout << "Telefon-" << pers.Telefon << endl;
        });

    in.close();


error C2059: syntax error : '['

Вот тут что именно писать чтобы считать в ту же Familiya например.

cout << "Familiya-" << pers.Familiya << endl;
error C2039: 'Familiya' : is not a member of 'std::vector<_Ty>'
Re[3]: <vector> C++
От: peterbes Россия  
Дата: 31.05.11 04:55
Оценка:
Федор с чем конкретным ты несогласен?

Эти строки полнейшая лажа, у тебя имеется другое мнение?
out.write((char*)&pers[0], pers.size()*sizeof(Person)
in.read((char*)&pers_in[0], size*sizeof(Person));

вместо того что бы кидаться минусами, взял бы написал тестовый пример хотя бы с таким классом

struct P
{    
    ~P(){delete[] A;delete[] B;delete[] C;}
    P(){A=new char[0xFF]; B=new char[0xFF];C=new char[0xFF];}
    
    void operator = (const P & p) {memcpy(A,p.A,0xFF);memcpy(B,p.B,0xFF);memcpy(C,p.C,0xFF);}
    void foo();
    char* A;
    char* B;
    char* C;
};

Ну,скопировал ты 12 байт в какой-то массив, любое обращение к полям прочитанного объекта это гарантированное падение твоей программы.
Re[4]: <vector> C++
От: BulatZiganshin  
Дата: 31.05.11 05:28
Оценка:
Здравствуйте, peterbes, Вы писали:

P>вместо того что бы кидаться минусами, взял бы написал тестовый пример хотя бы с таким классом


он говорит о POD записи, ты не знаешь что это такое?
Люди, я люблю вас! Будьте бдительны!!!
Re[5]: <vector> C++
От: peterbes Россия  
Дата: 31.05.11 05:52
Оценка:
Здравствуйте, BulatZiganshin, Вы писали:

BZ>он говорит о POD записи, ты не знаешь что это такое?


Знаю, первоначальные условия ничего не говорят о PODе, нет даже намека на это, ПОД зачем-то затащили уже потом, следующим шагом будет появление sqlite.
Re: <vector> C++
От: AleksandrN Россия  
Дата: 31.05.11 06:25
Оценка:
Здравствуйте, Usefur, Вы писали:

U>Уважаемые, прошу вашей помощи. Меня интересует вопрос как записать данные из вектора (в моем случае "vector <Person> pers") данные в файл, чтобы потом их можно было считать. В векторе хранятся только данные о Имени, Фамилии, Дате рождения, Телефоне. Ну и нужно их сохранять, чтобы при каждом запуске программы не вводить всю информацию заново.


Думаю, для лабораторки проще сделать текстовый файл
В классе Person создай методы
bool Write(FILE *);
bool Read(FILE *);

Для записи, иди по списку и для каждого Person вызывай Write.
Для чтения, создавай Person, вызывай Read, добавляй Person список. Читай файл до тех пор, пока feof() ноль возвращает.

Используй fopen, fclose, fprintf, fscanf, feof.
Re[8]: Не используйте Boost.serialization
От: Serg27  
Дата: 31.05.11 07:27
Оценка: 8 (2) +1
Здравствуйте, blackhearted, Вы писали:


BFE>>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

B>можно пример ошибки?
здесь
Обратите внимание на длину обсуждения, длительность, результативность и т.п. Кроме того есть соответствующие обсуждения в блоге разработчиков. Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

Boost по своей природе не является брендом, который гарантирует хоть какое-то сопровождение. У него просто нет механизмов для поддержки, кроме доброй воли авторов. Поэтому надо всегда смотреть на каждую отдельную библиотеку из boost и принимать решение об ее использовании независимо. boost как бренд гарантирует только определенное качество продукта и качество проектных решений.
Re[9]: Не используйте Boost.serialization
От: okman Беларусь https://searchinform.ru/
Дата: 31.05.11 08:59
Оценка:
Здравствуйте, Serg27, Вы писали:

S>...

S>Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

Любопытства ради — что использовали взамен ?
Re[9]: Не используйте Boost.serialization
От: los puercos  
Дата: 31.05.11 10:27
Оценка:
Здравствуйте, B0FEE664, Вы писали:

BFE>>>А потом уйдут многие часы на борьбу с ошибками Boost.serialization.

B>>можно пример ошибки?

BFE>здесь
Автор: _ds_
Дата: 30.05.11

BFE>У нас те же самые проблемы.

Отсутствие обратной совместимости — все-таки, ошибка дизайна, с ней бороться бесполезно, можно только отказаться от использования библиотеки.

К тому же, не всем критична обратная совместимость.
Мы при выходе новой версии можем оперативно перетащить все сервера и клиенты, это разовый и нечастый гемор. В остальном же boost.serialization всем устраивает.
Re[3]: <vector> C++
От: los puercos  
Дата: 31.05.11 11:49
Оценка:
Здравствуйте, Usefur, Вы писали:

U>>ну а потом подумай как тебе удобно упаковать данные в блоки чтоб их потом оттуда можно было однозначно вычитать.


U>Е нет...на курсовую(которую мне послезавтра сдавать))


Товарищу майору сдадите.
(когда будут отпускать в увольнение, подучи все же С++, пригодится )
Re[10]: Не используйте Boost.serialization
От: Serg27  
Дата: 31.05.11 16:43
Оценка: 1 (1) :)
Здравствуйте, okman, Вы писали:

O>Здравствуйте, Serg27, Вы писали:


S>>...

S>>Для себя сделали вывод — boost::serialization является фактически не поддерживаемой и прекратили ее использование в проекте (как раз шла модернизация...)

O>Любопытства ради — что использовали взамен ?

Так как фактически сериализовались объекты, которые описывали конфигурацию, то был произведен переход на json. Массовое использование boost::serialization для собственно данных было прекращено раньше по другим причинам (т.е. не связанным собственно с boost::serialization).
У меня до сих пор довольно хорошее впечатление о boost::serialization, но использовать его в производствнном коде нельзя из-за проблем сопровождения (это ж надо было порушить обратную совместимость бинарных архивов).
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.