Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > чтение структуры из файла


Автор: шарлотта 12.10.2017, 23:23
Здравствуйте! 
Возникает ошибка при чтении структуры из файла и при дозаписи в файл.
Код

struct Payment {
    int flat_num;
    std::string surname;

    void BuildFile(const char *str);
    void PrintFile(const char *str);
    void AddNote(const char *str);
};

void Payment::BuildFile(const char *str) {
    std::fstream file(str, std::ios::out | std::ios::binary);
    if (!file) {
        std::cerr << "cannot open file " << str << std::endl;
    } else {
        Payment buf;
        std::cout << "flat_num:  ";
        std::cin >> buf.flat_num;
        std::cout << "surname:  ";
        std::cin >> buf.surname;
        file.write((char*)&buf, sizeof(buf));
    }
}

void Payment::PrintFile(const char *str) {
    std::fstream file(str, std::ios::in | std::ios::binary);
    if (!file) {
        std::cerr << "cannot open file " << str << std::endl;
    } else {
        Payment buf;
        while (file.read((char*)&buf, sizeof buf)) {
            std::cout << "flat_num:  " << buf.flat_num << std::endl;
            std::cout << "surname:  " << buf.surname << std::endl;
            std::cout << std::endl;
        }
    }//здесь ошибка Вызвано исключение: нарушение доступа для чтения._Pnext было 0x137E94C.
}

void Payment::AddNote(const char *str, int count) {
    std::fstream file(str, std::ios::ate | std::ios::binary);
    if (!file) {
        std::cerr << "cannot open file " << str << std::endl; //выводит сообщение, что не может открыть файл
    } else {
        Payment buf;
        std::cout << "flat_num:  ";
        std::cin >> buf.flat_num;
        std::cout << "surname:  ";
        std::cin >> buf.surname;
        file.write((char*)&buf, sizeof(buf));
    }
}

//вызов
Payment pay;
pay.BuildFile("pay.dat");
pay1.AddNote("pay.dat");
pay.PrintFile("pay.dat");

Буду очень благодарна за помощь!

Автор: baldman88 13.10.2017, 07:56
Дык, что Вы записываете то? Просто адрес структуры (&buf). Если хотите записывать структуры в файл, то почитайте про сериализацию/десериализацию. Можно написать (для несложных стуктур, как в Вашем случае) методы, которые будут записывать (построчно, в одну строку через разделитель или как-либо еще) значения каждого поля структуры, и метод, который потом это все будет читать и присваивать новой структуре. Но советую все же использовать сериализацию/десериализацию.

Автор: xvr 13.10.2017, 12:13
Через write/read можно писать/читать только POD структуры, т.е. состоящие из простых С типов и других таких структур. Ваша Payment содержит поле типа std::string, который использует динамическую память. Вы можете сохранить сам класс в файл, но та память, на которую он ссылался никуда не сохраняется, а при чтении не восстанавливается. Отсюда и последующие ошибки

Автор: шарлотта 13.10.2017, 13:00
Большое спасибо!

Автор: шарлотта 13.10.2017, 20:51
Требуется преобразовать данные бинарного файла в текстовый файл в виде ведомости с графой общих итогов.
void Payment::Translate(const char *str) {
    std::fstream file(str, std::ios::in | std::ios::binary);
    if (!file) {
        std::cerr << "cannot open file " << str << std::endl;
    } else {
        Payment buf;
        std::vector<Payment> vect;
        while (file.read((char*)&buf, sizeof buf)) {
            vect.push_back(buf);
        }
        std::fstream file2("pay1.txt", std::ios::in);
        if (!file2) {
            std::cerr << "cannot open file " << "pay1.txt" << std::endl;
        } else {
            std::ostream_iterator<Payment> writer(file2, "\n");
            std::copy(vect.begin(), vect.end(), writer);
        }
    }
}
Выводит просто в столбик. Возможно ли вывести данные в виде ведомости с графой общих итогов?
И возможно ли реализовать эту функцию не с помощью вектора, а с помощью отображения(map)?
Заранее большое спасибо!

Автор: шарлотта 14.10.2017, 20:40
Спасибо за помощь, удалось разобраться!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)