Re[2]: <vector> C++
От: Fedor Sumkin
Дата: 30.05.11 19:51
Оценка:
Да, данный способ верен для POD-типов и хорош тем что не надо задумываться о внутреннем устройстве структуры/класса — единственное, что нужно использовать — массивы вместо указателей. Также, его можно легко расширить, добавив дополнительные данные в структуру и ничего не поломается(если нет необходимости в поддержке совместимости со старыми форматами файлов где хранится информация). В рамках поставленной задачи — самое разумное решение в 30-50 строк. Ну и что, что файл может стать большим — чем-то приходится жертвовать.

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

Запись :
#include <fstream>
#include <vector>

using namespace std;

struct Person {
    int age;
    char fir_name[30];
    char sec_name[30];
};

Person p = {20, "Martin", "Fowler"};

int main () {
    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();
}


Чтение :
#include <fstream>
#include <vector>
#include <iostream>
#include <algorithm>

using namespace std;

struct Person {
    int age;
    char fir_name[30];
    char sec_name[30];
};

Person p;

int main () {
    vector<Person> pers;

    int size = 0;

    ifstream in("data.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) -> int {
            cout << "age-" << p.age << endl;
            cout << "fir_name-" << p.fir_name << endl;
            cout << "sec_name-" << p.sec_name << endl
        });

    in.close();
    }
avalon 1.0rc3 rev 419, zlib 1.2.5
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.