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

Чтение объекта из файла

30.07.2012, 15:30. Показов 3831. Ответов 11
Метки нет (Все метки)

Мне нужно записать в файл а потом прочитать из него много объектов одного класса я написал такой класс для работы с файлом:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef IO_ELM_H
#define IO_ELM_H
#include <QString>
#include <QFile>
#include "him_elem.h"
 
class io_elm
{
    QString aktion;
    QFile *file;
public:
    io_elm(QString fileName, QString toDo);
    bool fout(const him_elem* elem);
    bool fin(him_elem* elem);
    ~io_elm();
};
 
#endif // IO_ELM_H
C++ (Qt)
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
#include <QFile>
#include <QString>
#include <QDebug>
io_elm::io_elm(QString fileName, QString toDo)
{
    file = new QFile(fileName);
    if(file->exists())
    {
        if(toDo == "Write")
        {
            file->open(QIODevice::Append);
        }
        else if(toDo == "ReWrite")
        {
            file->open(QIODevice::WriteOnly);
        }
        else
        {
            file->open(QIODevice::ReadOnly);
        }
    }
    else
    {
        if(toDo == "Write" || toDo == "ReWrite")
        {
            file->open(QIODevice::WriteOnly);
        }
        else
        {
            qDebug() << "File not found";
        }
    }
}
bool io_elm::fin(him_elem *elem)
{
    if(file->isReadable())
    {
        file->read((char*)elem,sizeof(him_elem));
        if(file->error() == QFile::NoError)
            return true;
        else return false;
    }
    else return false;
}
bool io_elm::fout(const him_elem *elem)
{
    if(file->isWritable())
    {
        file->write((char*)elem,sizeof(him_elem));
        if(file->error() == QFile::NoError)
            return true;
        else return false;
    }
    else return false;
}
io_elm::~io_elm()
{
    file->close();
    delete file;
}
как видно из кода в конструкторе файл открывается для чтения или записи в зависимости от значения переменной ToDo. На запись, вроде, работает появляется файл с нужным именем и каким-то содержимым но при попытке вызова методов считанного объекта происходит вылет программы, видимо в область памяти на которую указывает указатель на объект пишется что-то не то!
Пожалуйста помогите разобраться!
Зарание спасибо!
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.07.2012, 15:30
Ответы с готовыми решениями:

Сохранение и чтение объекта класса в файл/из файла
Добрый день! Столкнулся с проблемой сохранения объекта класса в файл, и последующего его...

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

Запись и чтение объекта класса в файл и из файла
У меня есть std::list состоящий из объектов типа Person это база о людях. Нужно реализовать два...

Запись объекта класса в файл и чтение из файла (Вызвано необработанное исключение: нарушение доступа для чтения)
Доброго времени суток. Вообщем-то есть некий класс Weapons: class Weapons { public: void...

11
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
30.07.2012, 16:23 2
я бы это дело ещё и в QDataStream обернул, для надёжности, тогда и работать легче будет

Добавлено через 1 минуту
и кстати, как fin вызывается, код в студию пожалуйста, есть предположение, что вы туда просто мусор передаёте или null
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
31.07.2012, 08:58  [ТС] 3
Вот код формы которая запрашивает у пользователя значения полей объекта, производит проверку значений, создает объект класса заполняет его поля и записывае объект в файл
C++ (Qt)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
#include "addform.h"
#include "him_elem.h"
#include "io_elm.h"
#include "complinf.h"
#include <QtGui>
#include <QTextCodec>
 
AddForm::AddForm(QWidget *pwgt) : QWidget(pwgt)
{
    QTextCodec *cyrCodec = QTextCodec::codecForName("CP1251");
    QTextCodec::setCodecForTr(cyrCodec);
    QTextCodec::setCodecForCStrings(cyrCodec);
    QLabel *nEl = new QLabel("Номер элемента:");
    nEl->setMaximumSize(130,20);
    QLabel *pEl = new QLabel("Период элемента:");
    pEl->setMaximumSize(130,20);
    QLabel *cpEl = new QLabel("Ряд элемента:");
    cpEl->setMaximumSize(130,20);
    QLabel *liEl = new QLabel("Строка элемента:");
    liEl->setMaximumSize(130,20);
    QLabel *gEl = new QLabel("Группа элемента:");
    gEl->setMaximumSize(130,20);
    QLabel *snEl = new QLabel("Краткое имя элемента:");
    snEl->setMaximumSize(130,20);
    QLabel *rnEl = new QLabel("Русское название:");
    rnEl->setMaximumSize(130,20);
    QLabel *lnEl = new QLabel("Латинское название:");
    lnEl->setMaximumSize(130,20);
    QLabel *tpEl = new QLabel("Тип элемента:");
    tpEl->setMaximumSize(130,20);
    QLabel *tpcEl = new QLabel("Цвет плашки элемента:");
    tpcEl->setMaximumSize(130,20);
    QLabel *eoEl = new QLabel("Электр. отр. элемента:");
    eoEl->setMaximumSize(130,20);
    QLabel *dsEl = new QLabel("Плотность элемента:");
    dsEl->setMaximumSize(130,20);
    QLabel *arEl = new QLabel("Атом. рад. элемента:");
    arEl->setMaximumSize(130,20);
    QLabel *avEl = new QLabel("Атом. объем элемента:");
    avEl->setMaximumSize(130,20);
    QLabel *crEl = new QLabel("Ковал. рад. элемента:");
    crEl->setMaximumSize(130,20);
    QLabel *raEl = new QLabel("Радиоактивность элемента:");
    raEl->setMaximumSize(130,20);
    QLabel *amEl = new QLabel("Атомная масса:");
    amEl->setMaximumSize(130,20);
    QLabel *esEl = new QLabel("Электронная структура:");
    esEl->setMaximumSize(130,20);
    QLabel *oxEl = new QLabel("Степ. окисл. элемента:");
    oxEl->setMaximumSize(130,20);
    QLabel *mpEl = new QLabel("Темр. плав. элемента:");
    mpEl->setMaximumSize(130,20);
    QLabel *bpEl = new QLabel("Темр. кип. элемента:");
    bpEl->setMaximumSize(130,20);
    QLabel *ip1El = new QLabel("Пот. ион. 1 элемента:");
    ip1El->setMaximumSize(130,20);
    QLabel *ip2El = new QLabel("Пот. ион. 2 элемента:");
    ip2El->setMaximumSize(130,20);
    QLabel *ip3El = new QLabel("Пот. ион. 3 элемента:");
    ip3El->setMaximumSize(130,20);
    QLabel *ncEl = new QLabel("Природ. цвет элкмента:");
    ncEl->setMaximumSize(130,20);
    QLabel *feEl = new QLabel("Как часто встречается:");
    feEl->setMaximumSize(130,20);
    QLabel *dcEl = new QLabel("Открыватель элемента:");
    dcEl->setMaximumSize(130,20);
    QLabel *cdEl = new QLabel("Страна откр. элемента:");
    cdEl->setMaximumSize(130,20);
    QLabel *ydEl = new QLabel("Год открытия:");
    ydEl->setMaximumSize(130,20);
    elmNum = new QLineEdit;
    elmNum->setMaximumSize(50,20);
    elmNum->setMaxLength(3);
    elmPeriod = new QLineEdit;
    elmPeriod->setMaximumSize(50,20);
    elmPeriod->setMaxLength(3);
    colPos = new QLineEdit;
    colPos->setMaximumSize(50,20);
    colPos->setMaxLength(3);
    linPos = new QLineEdit;
    linPos->setMaximumSize(50,20);
    linPos->setMaxLength(3);
    elmGroup = new QLineEdit;
    elmGroup->setMaximumSize(50,20);
    elmShName = new QLineEdit;
    elmShName->setMaximumSize(50,20);
    elmShName->setMaxLength(3);
    elmRuName = new QLineEdit;
    elmRuName->setMaximumSize(100,20);
    elmLtName = new QLineEdit;
    elmLtName->setMaximumSize(100,20);
    elmType = new QLineEdit;
    elmType->setMaximumSize(100,20);
    elmTpCol = new QLineEdit;
    elmTpCol->setMaximumSize(100,20);
    elmElNeg = new QLineEdit;
    elmElNeg->setMaximumSize(80,20);
    elmDens = new QLineEdit;
    elmDens->setMaximumSize(80,20);
    elmAtRad = new QLineEdit;
    elmAtRad->setMaximumSize(80,20);
    elmAtVol = new QLineEdit;
    elmAtVol->setMaximumSize(80,20);
    elmCvRad = new QLineEdit;
    elmCvRad->setMaximumSize(80,20);
    elmRadAc = new QLineEdit;
    elmRadAc->setMaximumSize(20,20);
    elmRadAc->setMaxLength(1);
    elmAtMass = new QLineEdit;
    elmAtMass->setMaximumSize(80,20);
    elmElStruct = new QLineEdit;
    elmElStruct->setMaximumSize(150,20);
    elmOxid = new QLineEdit;
    elmOxid->setMaximumSize(80,20);
    elmMlPt = new QLineEdit;
    elmMlPt->setMaximumSize(80,20);
    elmBlPt = new QLineEdit;
    elmBlPt->setMaximumSize(80,20);
    elmIoPt1 = new QLineEdit;
    elmIoPt1->setMaximumSize(80,20);
    elmIoPt2 = new QLineEdit;
    elmIoPt2->setMaximumSize(80,20);
    elmIoPt3 = new QLineEdit;
    elmIoPt3->setMaximumSize(80,20);
    elmNtColor = new QLineEdit;
    elmNtColor->setMaximumSize(100,20);
    elmFrEnc = new QLineEdit;
    elmFrEnc->setMaximumSize(50,20);
    elmDiscov = new QLineEdit;
    elmDiscov->setMaximumSize(150,20);
    elmCountry = new QLineEdit;
    elmCountry->setMaximumSize(80,20);
    elmYear = new QLineEdit;
    elmYear->setMaximumSize(50,20);
    elmYear->setMaxLength(4);
    QPushButton *okBut = new QPushButton("SAVE");
    connect(okBut, SIGNAL(pressed()), this, SLOT(buttonOKClik()));
    QPushButton *shBut = new QPushButton("SHOW");
    connect(shBut, SIGNAL(pressed()), this, SLOT(buttonShClik()));
    QVBoxLayout *mvLabs = new QVBoxLayout;
    mvLabs->addWidget(nEl);
    mvLabs->addWidget(pEl);
    mvLabs->addWidget(cpEl);
    mvLabs->addWidget(liEl);
    mvLabs->addWidget(gEl);
    mvLabs->addWidget(snEl);
    mvLabs->addWidget(rnEl);
    mvLabs->addWidget(lnEl);
    mvLabs->addWidget(tpEl);
    mvLabs->addWidget(tpcEl);
    mvLabs->addWidget(eoEl);
    mvLabs->addWidget(dsEl);
    mvLabs->addWidget(arEl);
    mvLabs->addWidget(avEl);
    mvLabs->addWidget(crEl);
    mvLabs->addWidget(raEl);
    mvLabs->addWidget(amEl);
    mvLabs->addWidget(esEl);
    mvLabs->addWidget(oxEl);
    mvLabs->addWidget(mpEl);
    mvLabs->addWidget(bpEl);
    mvLabs->addWidget(ip1El);
    mvLabs->addWidget(ip2El);
    mvLabs->addWidget(ip3El);
    mvLabs->addWidget(ncEl);
    mvLabs->addWidget(feEl);
    mvLabs->addWidget(dcEl);
    mvLabs->addWidget(cdEl);
    mvLabs->addWidget(ydEl);
    QVBoxLayout *mvLine = new QVBoxLayout;
    mvLine->addWidget(elmNum);
    mvLine->addWidget(elmPeriod);
    mvLine->addWidget(colPos);
    mvLine->addWidget(linPos);
    mvLine->addWidget(elmGroup);
    mvLine->addWidget(elmShName);
    mvLine->addWidget(elmRuName);
    mvLine->addWidget(elmLtName);
    mvLine->addWidget(elmType);
    mvLine->addWidget(elmTpCol);
    mvLine->addWidget(elmElNeg);
    mvLine->addWidget(elmDens);
    mvLine->addWidget(elmAtRad);
    mvLine->addWidget(elmAtVol);
    mvLine->addWidget(elmCvRad);
    mvLine->addWidget(elmRadAc);
    mvLine->addWidget(elmAtMass);
    mvLine->addWidget(elmElStruct);
    mvLine->addWidget(elmOxid);
    mvLine->addWidget(elmMlPt);
    mvLine->addWidget(elmBlPt);
    mvLine->addWidget(elmIoPt1);
    mvLine->addWidget(elmIoPt2);
    mvLine->addWidget(elmIoPt3);
    mvLine->addWidget(elmNtColor);
    mvLine->addWidget(elmFrEnc);
    mvLine->addWidget(elmCountry);
    mvLine->addWidget(elmDiscov);
    mvLine->addWidget(elmYear);
    QHBoxLayout *btGl = new QHBoxLayout;
    btGl->addWidget(okBut);
    btGl->addWidget(shBut);
    QHBoxLayout *mhFrm = new QHBoxLayout;
    mhFrm->addLayout(mvLabs);
    mhFrm->addLayout(mvLine);
    QVBoxLayout *finLO = new QVBoxLayout;
    finLO->addLayout(mhFrm);
    finLO->addLayout(btGl);
    setLayout(finLO);
}
bool AddForm::verifyInp(QLineEdit *pole, QRegExp exp, bool incl)
{
    QString test = pole->text();
    if(test.isEmpty()) return false;
    if(test.contains(exp)) return incl;
    else return !incl;
}
 
AddForm::~AddForm()
{
    delete elmNum;
    delete elmPeriod;
    delete colPos;
    delete linPos;
    delete elmGroup;
    delete elmShName;
    delete elmRuName;
    delete elmLtName;
    delete elmType;
    delete elmTpCol;
    delete elmElNeg;
    delete elmDens;
    delete elmAtRad;
    delete elmAtVol;
    delete elmCvRad;
    delete elmRadAc;
    delete elmAtMass;
    delete elmElStruct;
    delete elmOxid;
    delete elmMlPt;
    delete elmBlPt;
    delete elmIoPt1;
    delete elmIoPt2;
    delete elmIoPt3;
    delete elmNtColor;
    delete elmFrEnc;
    delete elmDiscov;
    delete elmCountry;
    delete elmYear;
}
void AddForm::buttonOKClik()
{
    QRegExp regDbl("[0-9\\.]");
    QRegExp regNum("[0-9]");
    bool error = false;
    int num = 0;
    if(verifyInp(elmNum, regNum, true))
    {
        num = elmNum->text().toInt();
    }
    else
    {
        elmNum->selectAll();
        error = true;
    }
    int period = 0;
    if(verifyInp(elmPeriod, regNum, true) && !error)
    {
        period = elmPeriod->text().toInt();
    }
    else
    {
        if(!error) elmPeriod->selectAll();
        error = true;
    }
    int col = 0;
    if(verifyInp(colPos, regNum, true) && !error)
    {
        col = colPos->text().toInt();
    }
    else
    {
        colPos->selectAll();
        error = true;
    }
    int lin = 0;
    if(verifyInp(linPos, regNum, true) && !error)
    {
        lin = linPos->text().toInt();
    }
    else
    {
        linPos->selectAll();
        error = true;
    }
    QString group = "";
    if(verifyInp(elmGroup, regNum, false) && !error)
        group = elmGroup->text();
    else
    {
        if(!error)elmGroup->selectAll();
        error = true;
    }
    QString shortN = "";
    if(verifyInp(elmShName, regNum, false) && !error)
        shortN = elmShName->text();
    else
    {
        if(!error)elmShName->selectAll();
        error = true;
    }
    QString rusN = "";
    if(verifyInp(elmRuName, regNum, false) && !error)
        rusN = elmRuName->text();
    else
    {
        if(!error)elmRuName->selectAll();
        error = true;
    }
    QString latN = "";
    if(verifyInp(elmLtName, regNum, false) && !error)
        latN = elmLtName->text();
    else
    {
        if(!error)elmLtName->selectAll();
        error = true;
    }
    QString typeEl = "";
    if(verifyInp(elmType, regNum, false) && !error)
        typeEl = elmType->text();
    else
    {
        if(!error)elmType->selectAll();
        error = true;
    }
    QString typeClEl = "";
    if(verifyInp(elmTpCol, regNum, true) && !error)
        typeClEl = elmTpCol->text();
    else
    {
        if(!error)elmTpCol->selectAll();
        error = true;
    }
    QString elNegEl = elmElNeg->text();
    QString densEl = elmDens->text();
    QString atRdEl = elmAtRad->text();
    QString atVlEl = elmAtVol->text();
    QString cvRdEl = elmCvRad->text();
    bool radEl;
    if(elmRadAc->text()!="0") radEl = true;
    else radEl =false;
    QString massEl = "";
    if(verifyInp(elmAtMass, regNum, true) && !error)
    {
        massEl = elmAtMass->text();
    }
    else
    {
        if(!error) elmAtMass->selectAll();
        error = true;
    }
    QString structE = "";
    if(verifyInp(elmElStruct, regNum, true) && !error)
    {
        structE = elmElStruct->text();
    }
    else
    {
        if(!error) elmElStruct->selectAll();
        error = true;
    }
    QString oxidEl = "";
    if(verifyInp(elmOxid, regNum, true) && !error)
    {
        oxidEl = elmOxid->text();
    }
    else
    {
        if(!error) elmOxid->selectAll();
        error = true;
    }
    QString melPtEl = elmMlPt->text();
    QString bolPtEl = elmBlPt->text();
    QString ioPtEl1 = elmIoPt1->text();
    QString ioPtEl2 = elmIoPt2->text();
    QString ioPtEl3 = elmIoPt3->text();
    QString natClEl = "";
    if(verifyInp(elmNtColor, regNum, false) && !error)
    {
        natClEl = elmNtColor->text();
    }
    else
    {
        if(!error) elmNtColor->selectAll();
        error = true;
    }
    int freqEl = 0;
    if(verifyInp(elmFrEnc, regNum, true) && !error)
    {
        freqEl = elmFrEnc->text().toInt();
    }
    else
    {
        if(!error) elmFrEnc->selectAll();
        error = true;
    }
    QString discavE = "";
    if(verifyInp(elmDiscov, regNum, false) && !error)
        discavE = elmDiscov->text();
    else
    {
        if(!error)elmDiscov->selectAll();
        error = true;
    }
    QString counEl = "";
    if(verifyInp(elmCountry, regNum, false) && !error)
    {
        counEl = elmCountry->text();
    }
    else
    {
        if(!error) elmCountry->selectAll();
        error = true;
    }
    int yearE = 0;
    if(verifyInp(elmYear, regNum, true) && !error)
    {
        yearE = elmYear->text().toInt();
    }
    else
    {
        if(!error) elmYear->selectAll();
        error = true;
    }
    if(!error)
    {
        him_elem elem;
        elem.setNumElm(num);
        elem.setPeriodElm(period);
        elem.setColPoz(col);
        elem.setStrPoz(lin);
        elem.setGroupElm(group);
        elem.setShtName(shortN);
        elem.setRusName(rusN);
        elem.setLatName(latN);
        elem.setElmType(typeEl);
        elem.setElmTpColor(typeClEl);
        elem.setElectrNeg(elNegEl);
        elem.setElmDensity(densEl);
        elem.setAtomRadius(atRdEl);
        elem.setAtomVolume(atVlEl);
        elem.setCovRadius(cvRdEl);
        elem.setRadioactive(radEl);
        elem.setAtomMass(massEl);
        elem.setElkStruct(structE);
        elem.setOxidation(oxidEl);
        elem.setMeltPoint(melPtEl);
        elem.setBoilPoint(bolPtEl);
        elem.setIonPat1(ioPtEl1);
        elem.setIonPat2(ioPtEl2);
        elem.setIonPat3(ioPtEl3);
        elem.setElmColor(natClEl);
        elem.setFreqEnc(freqEl);
        elem.setDiscaverer(discavE);
        elem.setCountry(counEl);
        elem.setYearOfDiscave(yearE);
        io_elm tabFile("him_tab.dat","Write");
        tabFile.fout(&elem);
        elmNum->setText("");
        elmNum->setFocus();
        elmPeriod->setText("");
        colPos->setText("");
        linPos->setText("");
        elmGroup->setText("");
        elmShName->setText("");
        elmRuName->setText("");
        elmLtName->setText("");
        elmType->setText("");
        elmTpCol->setText("");
        elmElNeg->setText("");
        elmDens->setText("");
        elmAtRad->setText("");
        elmAtVol->setText("");
        elmCvRad->setText("");
        elmRadAc->setText("");
        elmAtMass->setText("");
        elmElStruct->setText("");
        elmOxid->setText("");
        elmMlPt->setText("");
        elmBlPt->setText("");
        elmIoPt1->setText("");
        elmIoPt2->setText("");
        elmIoPt3->setText("");
        elmNtColor->setText("");
        elmFrEnc->setText("");
        elmDiscov->setText("");
        elmCountry->setText("");
        elmYear->setText("");
    }
}
void AddForm::buttonShClik()
{
    him_elem elem;
    io_elm tabFile("him_tab.dat","Read");
    tabFile.fin(&elem);
    elmNum->setText(QString::number(elem.getNumElm()));
//    ComplInf *info = new ComplInf(&elem);
//    info->show();
}
в конце кусочек которым я пытался прочитать объект. Чтение происходит но как только я пытаюсь вызвть метод, в данном случае getNumElm() программа падает!
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.07.2012, 09:18 4
что-то не нравится, что понять не могу... но текста очень много и он однотипный, 100% можно написать по красивее. А на тему сохранения объектов, попробуйте все же использовать QDataStream, я бы зарегистрировал свой объект в метасистеме Qt (qRegisterMetaObject в помощь) и дальше преобразовал бы его к QVariant, а дальше QVariant зафигачил бы уже в DataStream и возможно наступило бы вселенское счастье....
зы: могу конечно ошибаться, но имхо
C++ (Qt)
1
sizeof(him_elem)
хрень редкая, т.к. это указатель, а указатель как мы знаем всегда одного размера
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
31.07.2012, 09:30  [ТС] 5
him_elem - это название класса!
много текста потому что форма написана без интерфейс билдера.
Основной фрагмет чтения объекта находится в конце!
Там 4 строчки.
По поводу QDataStream если можно подробнее, я не имею большого опыта в программировании и только начинаю изучать Qt
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.07.2012, 09:39 6
повторюсь:
C++ (Qt)
1
2
3
4
5
6
7
8
9
void AddForm::buttonShClik()
{
    him_elem elem;
    io_elm tabFile("him_tab.dat","Read");
    tabFile.fin(&elem);
    elmNum->setText(QString::number(elem.getNumElm()));
//    ComplInf *info = new ComplInf(&elem);
//    info->show();
}
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
bool io_elm::fin(him_elem *elem)
{
    if(file->isReadable())
    {
        file->read((char*)elem,sizeof(him_elem)); //[COLOR="red"]всегда читаем 4 байта!!!!![/COLOR]
        if(file->error() == QFile::NoError)
            return true;
        else return false;
    }
    else return false;  //[COLOR="Red"]странно что компилятор на это не ругнулся!!!!![/COLOR]
}
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
31.07.2012, 09:51  [ТС] 7
Почему 4 байта ведь him_elem имя класса?
и sizeof(him_elem) должно дать размер экземпляра класса!
0
Эксперт С++
1934 / 1046 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.07.2012, 22:51 8
упс... пардон! я затупил...

Добавлено через 12 часов 36 минут
этот волшебный класс - это виджет???
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
01.08.2012, 12:09  [ТС] 9
Нет, класс обычный, содержит поля типа int, bool, QString и методы set и get для каждого поля

Добавлено через 12 часов 56 минут
решил проблему следующим образом:
написал в объекте два метода, первый значения всех полей объекта записывает в одну строку вставляя между значениями спецсимвол и второй, который из строки нужного формата заполняет поля объекта.
Переписал класс для работы с файлом он теперь получая на вход указатель на объект для записи в файл переводит объект в строку и ее пишет в файл, при чтении происходит обратная операция при помощи выше описанных методов!
0
83 / 83 / 42
Регистрация: 25.01.2010
Сообщений: 386
09.02.2013, 01:55 10
Цитата Сообщение от Serg_GR Посмотреть сообщение
Нет, класс обычный, содержит поля типа int, bool, QString и методы set и get для каждого поля

Добавлено через 12 часов 56 минут
решил проблему следующим образом:
написал в объекте два метода, первый значения всех полей объекта записывает в одну строку вставляя между значениями спецсимвол и второй, который из строки нужного формата заполняет поля объекта.
Переписал класс для работы с файлом он теперь получая на вход указатель на объект для записи в файл переводит объект в строку и ее пишет в файл, при чтении происходит обратная операция при помощи выше описанных методов!

покажи плиз свою реализацию этих методов
0
1441 / 1322 / 131
Регистрация: 20.03.2009
Сообщений: 4,689
Записей в блоге: 11
09.02.2013, 21:42 11
Цитата Сообщение от Serg_GR Посмотреть сообщение
Нет, класс обычный, содержит поля типа int, bool, QString и методы set и get для каждого поля
Нельзя так делать
C++ (Qt)
1
2
file->read((char*)elem,sizeof(him_elem));
file->write((char*)elem,sizeof(him_elem));
если him_elem, содержит QString, т.к. QString не является pod типом.
Цитата Сообщение от l_a_m Посмотреть сообщение
А на тему сохранения объектов, попробуйте все же использовать QDataStream, я бы зарегистрировал свой объект в метасистеме Qt (qRegisterMetaObject в помощь) и дальше преобразовал бы его к QVariant, а дальше QVariant зафигачил бы уже в DataStream и возможно наступило бы вселенское счастье....
Бред.

C++ (Qt)
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
class Foo
{
public:
 
    const QString& bar()const
    {
       return bar_;
    }
    
    void setBar(const QString& bar)
    {
       bar_ = bar;
    }
private:
  QString bar_;
};
 
QDataStream &   operator<<(QDataStream &stream, const Foo& foo)
{
   stream<<foo.bar();
   return stream;
}
 
QDataStream &   operator>>(QDataStream &stream,  Foo& foo)
{
   QString str;
   stream>>str;
   foo.setBar(str);
   return stream;
}
0
0 / 0 / 0
Регистрация: 30.05.2012
Сообщений: 12
12.02.2013, 14:24  [ТС] 12
Методы следующие:
Преобразование в строку:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
QString him_elem::parseToString() const
{
    QString rad, resString;
    \\Преобразование булевого значения в строку!
    if(radioative) rad = "y";
    else rad = "n";
    //Получение стоки из полей объекта
    resString = QString::number(numElm)+"*"+QString::number(periodElm)+"*"+QString::number(colPoz)+"*"+QString::number(strPoz)+"*";
resString +=(groupElm+"*"+shtName+"*"+rusName+"*"+latName+"*"+elmType+"*"+elmTpColor+"*"+electrNeg+"*"+elmDensity+"*"+atomRadius+"*");
    resString +=(atomVolume+"*"+covRadius+"*"+rad+"*"+atomMass+"*"+elkStruct+"*"+oxidation+"*"+meltPoint+"*"+boilPoint+"*"+ionPat1+"*");
    resString +=(ionPat2+"*"+ionPat3+"*"+elmColor+"*"+QString::number(freqEnc)+"*"+Diskaverer+"*"+Country+"*"+QString::number(yearDiskav)+"*");
    return resString;
}
Из стоки данные заносятся в поля объекта:
C++ (Qt)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
void him_elem::parseToObject(QString readString)
{
    int lenStr = readString.size();
    int pos = 0;
    QString tmpStr="";
    for(int i = 0; i < lenStr; i++)
    {
        if(readString[i]!='*')
        {
            tmpStr.push_back(readString[i]);
        }
        else
        {
            switch(pos)
            {
            case 0:
                numElm=tmpStr.toInt();
                break;
            case 1:
                periodElm = tmpStr.toInt();
                break;
            case 2:
                colPoz = tmpStr.toInt();
                break;
            case 3:
                strPoz = tmpStr.toInt();
                break;
            case 4:
                groupElm = tmpStr;
                break;
            case 5:
                shtName = tmpStr;
                break;
            case 6:
                rusName = tmpStr;
                break;
            case 7:
                latName =tmpStr;
                break;
            case 8:
                elmType = tmpStr;
                break;
            case 9:
                elmTpColor = tmpStr;
                break;
            case 10:
                electrNeg = tmpStr;
                break;
            case 11:
                elmDensity = tmpStr;
                break;
            case 12:
                atomRadius = tmpStr;
                break;
            case 13:
                atomVolume = tmpStr;
                break;
            case 14:
                covRadius = tmpStr;
                break;
            case 15:
                if(tmpStr=="y") radioative = true;
                else radioative = false;
                break;
            case 16:
                atomMass = tmpStr;
                break;
            case 17:
                elkStruct = tmpStr;
                break;
            case 18:
                oxidation = tmpStr;
                break;
            case 19:
                meltPoint = tmpStr;
                break;
            case 20:
                boilPoint = tmpStr;
                break;
            case 21:
                ionPat1 = tmpStr;
                break;
            case 22:
                ionPat2 = tmpStr;
                break;
            case 23:
                ionPat3 = tmpStr;
                break;
            case 24:
                elmColor = tmpStr;
                break;
            case 25:
                freqEnc = tmpStr.toInt();
                break;
            case 26:
                Diskaverer = tmpStr;
                break;
            case 27:
                Country = tmpStr;
                break;
            case 28:
                yearDiskav = tmpStr.toInt();
                break;
            }
            pos++;
            tmpStr="";
        }
    }
}
Как-то так, может есть и более оптимальный вариант, у меня этот работает на ура!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.02.2013, 14:24

Чтение файла по локальной сети: "Ссылка на объект не указывает на экземпляр объекта"
Доброго времени суток. Мне необходимо считать txt файл и вывести информацию в combobox. В загрузку...

Запись объекта в файл и восстановление объекта из файла
Есть ли в яве что нибудь типа функции serialize как в php. А ещё типа print_r чтобы посмотреть что...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать...

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, &quot;ing&quot;) в текстовом документе. в...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.