0 / 0 / 1
Регистрация: 23.10.2015
Сообщений: 18
1

Ошибка в чтении класса из файла в переменную-буфер

11.10.2016, 21:03. Показов 821. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Я написал программу, суть которой заключается в следующем:
dat файл заполняется объектами класса field, который имеет два динамических поля float и int и спец. поле type, которое будет указывать, какое поле из двух (float или int) будет использоваться как "хранилище" данных. На C++ программирую недавно, поэтому "по традиции" все пошло не совсем гладко.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// запись динамической структуры в файл.cpp: главный файл проекта.
 
#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "vector"
 
using namespace System;
using namespace std;
 
class field //тип "поле"
{
public:
    int16_t type;//тип поля
    //char *sim;
    int16_t *short_int; //целый
    float *real; // вещественный
 
    void init_type() //читаем тип
    {
        cout << "tip..." << endl;
        //cout << "1 - simvol" << endl;
        cout << "1 - integer" << endl;
        cout << "2 - float" << endl;
        cin >> type;
        //if (type == 1) { sim = new(char);  cin >> *sim;  };
        if (type == 1) { short_int = new(int16_t);  cin >> *short_int;  };
        if (type == 2) { real = new(float);  cin >> *real;  };
    };
    void print_info() //выводим информацию о поле на экран
    {
        //if (type == 1) { cout << "simvol " << sim << endl; };
        if (type == 1) { cout << "integer " << short_int << endl; };
        if (type == 2) { cout << "float " << real << endl; };
    };
};
 
 
void main()
{
    int a;
    while (true)
    {
        cout << "1 - zapis 2 - vivod" << endl;
        cin >> a;
        if (a == 1) {
            field *buf = new(field);
            buf->init_type();
            fstream z("class.dat", ios_base::out | ios_base::binary | ios_base::app);
            z.write((char*)buf, sizeof(buf));//записываем в файл
            z.close();
            delete buf;
        };
        if (a == 2) {
            field *buf = new(field);
            ifstream c("class.dat", ios_base::in);
            while (!(c.eof()))
            {
                if (!(c.eof()))
                {
                    c.read((char*)buf, sizeof(buf));//читаем из файла
                    buf->print_info();
                };
            };
            delete buf;
            c.close();
        };
    };
}
Вообще изначально было три поля, третье - char, но я его пока что от греха убрал, ибо начинали лететь ошибки. Оставил два поля, но на экран выводит совсем не то, что нужно (скриншот). Причем постоянно одно и тоже (шестнадцатиричное, судя по всему) число. Мне кажется, адрес. Показалось, что в print_info не поставил знак *, поэтому, наверное, всегда выводит одно и то же число - может быть, адрес начала буфера, однако, если ставлю *, выделяет красным, значит, ошибка. И к тому же, последний объект в файле выводит почему-то дважды... Не подскажете, в чем проблема?
Миниатюры
Ошибка в чтении класса из файла в переменную-буфер  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.10.2016, 21:03
Ответы с готовыми решениями:

Ошибка при чтении объекта класса из файла
Долго я пытался решить проблему самостоятельно, а так же и искал ответы на форумах. Но в итоге не...

Ошибка при чтении нескольких объектов класса из файла
Добрый день! Пытаюсь считать данные из файла в объект класса, одну строку считывает, а дальше...

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

Ошибка в чтении функции из заголовочного класса (class header)
Прохожу боевое крещение в написании заголовков visual studio 2013 Source.cpp...

9
59 / 59 / 53
Регистрация: 05.05.2013
Сообщений: 150
11.10.2016, 21:56 2
а так не пробовали:
C++
1
 z.write((char*)&buf, sizeof(buf));
1
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
11.10.2016, 21:58 3
в файл вы слили адреса переменных, а не значения по этим адресам. зачитали тоже какие-то адреса, а по этим адресам всякий хлам или вообще ошибка доступа. у вас простые типа. непонятно, зачем у вас в буфере указатели. переделайте на значения, а не на указатели на значения. если не хотите, то сливайте в память значения. а перед чтением - выделяйте память под каждое значение и потом значение каждого по отдельности читайте в ранее выделенную под значение память. последний вариант - изваращение, но вдруг вам именно это и надо.
1
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
11.10.2016, 22:01 4
Сто раз объясняли, что класс с указателями так не сохранишь. Надо каждый массив внутри класса записывать явно.
1
0 / 0 / 1
Регистрация: 23.10.2015
Сообщений: 18
11.10.2016, 22:16  [ТС] 5
VAN0, очистил файл и начал заново... В файл вводит, да, по крайней мере размер его изменяется, но на экран вообще перестало выводить что либо. Поставил то же самое в c.read - не сработало, нажимаю "вывод" - вылетает, "попытка чтения или записи в защищенную память".

Добавлено через 4 минуты
DU3, я так и думал, что там какой-то адрес сливается... ну, попробую изменить...
nmcf, суть программы в том, чтобы как раз использовать "динамические" поля для экономии памяти, при этом должна быть переменная, которая указала бы на поле конкретного типа... т.е. я изначально взялся за невозможную задачу, и для того, чтобы она работала, придется вообще убрать указатели из класса?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
11.10.2016, 22:19 6
конкретно в вашем случае вы все усугубили.
ну и неплохо бы увидеть какую-нибудь теорию или там теорему, которая бы утверждала, что использование динамических полей вместо статических ведет к экономии памяти
1
0 / 0 / 1
Регистрация: 23.10.2015
Сообщений: 18
11.10.2016, 22:25  [ТС] 7
DU3, просто у меня тема курсового - создание аналога database access, только на C++, т.е. чтобы можно было удобно создавать небольшие базы данных, записи в которых с тем кол-вом и типом полей, которые установит пользователь, т.е. пользователь сам задает структуру таблицы... Я придумал, что каждая запись будет состоять из вектора полей, каждое поле - это несколько "ячеек" типа int, float и string, например, только будет еще "ячейка"-указатель на тип (целочисленное) - мы ведь в поле только одно значение заносим из нескольких... Вот и подумалось, что лучше будет сделать эти поля в классе динамическими и, зависимо от типа, просто зарезервировать нужное поле, чтобы не резервировать заодно и ненужные... Видимо, такой подход ни к чему, ни к какой "экономии" не приведет?
0
284 / 232 / 114
Регистрация: 07.09.2016
Сообщений: 584
11.10.2016, 22:31 8
изучите существующие, прежде чем сочинять свою. т.к. вы свою сочините, начнете реализовывать, столкнетесь с кучей сюрпризов c++, потом, когда таки сделаете что задумывали выяснится, что задумали не то, не так и криво заимплементели в добавок. т.е.
я не спец по этой теме. простой запрос в гугле memory db выдает кучу инфы. ну например https://en.wikipedia.org/wiki/... y_database
0
0 / 0 / 1
Регистрация: 23.10.2015
Сообщений: 18
11.10.2016, 22:33  [ТС] 9
DU3, Видимо, это действительно глупо... Ведь указатель содержит ТЕКУЩИЙ адрес переменной... Вот мы сгружаем переменную в файл, потом по адресу уже другое значение поступает, а мы сохранили в файле указатель на именно этот адрес, который уже запорчен... ааа, надо было раньше просто сесть и немного подумать над этими указателями... и в принципе, я же память на внешнем носителе использую, какая там разница до этой экономии и до этих динамических полей... Динамические поля можно будет использовать тогда, когда все будет проходить в ОЗУ, т е когда например буду работать через буфер, хотя все равно овчинка выделки не стоит... ну их, в общем, эти указатели... спасибо за помощь)
0
7786 / 6554 / 2983
Регистрация: 14.04.2014
Сообщений: 28,627
11.10.2016, 22:36 10
негритос, сохранять надо содержимое, а не сам указатель. И точно так же восстанавливать.
0
11.10.2016, 22:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.10.2016, 22:36
Помогаю со студенческими работами здесь

Ошибка в чтении из файла
Существует файл summ.txt в нем записаны числа разделенные пробелами, надо найти сумму этих чисел....

Ошибка в чтении из файла
Всем привет, Пишу программу, которая из файла txt, который заполнен строками типа:...

Ошибка в чтении из файла
Помогите, программа не хочет считывать данный из файла, выходит сообщение с ошибкой. void...

Ошибка при чтении файла
нужна помощь я хотел сделать так, чтобы текст из файла зачитывался в буфер и после был записан в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru