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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> чтение структуры из файла 
:(
    Опции темы
шарлотта
Дата 12.10.2017, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



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

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");

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

Это сообщение отредактировал(а) шарлотта - 13.10.2017, 00:57
PM MAIL   Вверх
baldman88
Дата 13.10.2017, 07:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 210
Регистрация: 18.1.2009

Репутация: 1
Всего: 7



Дык, что Вы записываете то? Просто адрес структуры (&buf). Если хотите записывать структуры в файл, то почитайте про сериализацию/десериализацию. Можно написать (для несложных стуктур, как в Вашем случае) методы, которые будут записывать (построчно, в одну строку через разделитель или как-либо еще) значения каждого поля структуры, и метод, который потом это все будет читать и присваивать новой структуре. Но советую все же использовать сериализацию/десериализацию.
PM MAIL   Вверх
xvr
Дата 13.10.2017, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 35
Всего: 223



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

PM MAIL   Вверх
шарлотта
Дата 13.10.2017, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Большое спасибо!

Это сообщение отредактировал(а) шарлотта - 13.10.2017, 13:03
PM MAIL   Вверх
шарлотта
Дата 13.10.2017, 20:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Требуется преобразовать данные бинарного файла в текстовый файл в виде ведомости с графой общих итогов.
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)?
Заранее большое спасибо!

Это сообщение отредактировал(а) шарлотта - 13.10.2017, 22:57
PM MAIL   Вверх
шарлотта
Дата 14.10.2017, 20:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 55
Регистрация: 1.3.2017

Репутация: нет
Всего: нет



Спасибо за помощь, удалось разобраться!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1050 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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