Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++ Qt
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
zXus
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 75
1

Класс-контейнер с возможностью записи и чтения в бинарный файл. Не работает

16.12.2013, 14:30. Просмотров 789. Ответов 4
Метки нет (Все метки)

Задание:
Добавить к классу-контейнеру возможность записи и чтения данных в бинарный файл, используя fstream.
Using namespace std

Мне сказали, что запись в этой программе осуществляется в текстовом виде, а нужно в бинарном, как это исправить?

Файлы:
Заголовочные:
intcontainer.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
#ifndef INTCONTAINER_H
#define INTCONTAINER_H
 
#include <assert.h>
 
class IntContainer
{
public:
    IntContainer();
    IntContainer(int newLength);
    ~IntContainer();
 
 
    int getLength();
 
    void erase();
 
private:
    int contLength;
    int *contData;
};
 
#endif // INTCONTAINER_H
mainwindow.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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include "intcontainer.h"
#include <fstream>
#include <ostream>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
 
    void viewCont();  // выводит содержимое контейнера в plainTextEdit_view
 
private:
    Ui::MainWindow *ui;
    IntContainer *myCont;
 
public slots:
    void createContainer();
 
private slots:
    void on_pushButton_save_clicked();
    void on_pushButton_load_clicked();
};
 
#endif // MAINWINDOW_H
Исходники:
intcontainer.cpp
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
#include "intcontainer.h"
 
IntContainer::IntContainer()
{
    contLength = 0;
    contData = 0;
}
 
IntContainer::IntContainer(int newLength)
{
    contLength = newLength;
    contData = new int[newLength];
}
 
IntContainer::~IntContainer()
{
    delete[] contData;
}
 
int& IntContainer::operator [](int contIndex)
{
    assert(contIndex >= 0 && contIndex < contLength);
    return contData[contIndex];
}
 
int IntContainer::getLength()
{
    return contLength;
}
 
void IntContainer::erase()
{
    delete[] contData;
    contData = 0;
    contLength = 0;
}
main.cpp
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <QApplication>
#include "mainwindow.h"
 
#include <iostream>
 
#include "intcontainer.h"
 
using namespace std;
 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
 
    return a.exec();
}
mainwindow.cpp
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
using namespace std;
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    connect( this->ui->pushButton_create, SIGNAL( clicked() ), this, SLOT( createContainer() ) );
    connect( this->ui->pushButton_erase, SIGNAL( clicked() ), this, SLOT( eraseContainer() ) );
    connect( this->ui->pushButton_exit, SIGNAL( clicked() ), this, SLOT( close() ) );
    connect( this->ui->pushButton_save, SIGNAL( clicked() ), this, SLOT( on_pushButton_save_clicked() ) );
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::createContainer()
{
    // создать новый контейнер с размером, указанным в plainTextEdit_size
    this->myCont = new IntContainer(this->ui->plainTextEdit_size->toPlainText().toInt());
 
    // сделать кнопки изменения контейнера активными
    this->ui->pushButton_erase->setEnabled(true);
    this->ui->pushButton_exit->setEnabled(true);
 
    this->viewCont();
}
 
// вывести контейнер в plainTextEdit_view
void MainWindow::viewCont()
{
    QString strCont;
    QString strLength = QString::number(this->myCont->getLength());
 
    for (int i=0; i < this->myCont->getLength(); i++)
    {
        strCont.append(QString::number(this->myCont->operator [](i)));
        strCont.append("\n");
    }
 
    this->ui->plainTextEdit_view->setPlainText(strCont);
    this->ui->label_Length->setText(strLength);
}
 
 
void MainWindow::eraseContainer()
{
    this->myCont->erase();
 
    this->viewCont();
}
 
void MainWindow::on_pushButton_save_clicked()
{
    QString qsfilename = this->ui->plainTextEdit_save->toPlainText();
    if (qsfilename.size() == 0)
        return;
 
    // конвертация QString в char* ([url]http://stackoverflow.com/questions/5505221/converting-qstring-to-char[/url])
    QByteArray ba = qsfilename.toLatin1();
    const char *FileName = ba.data();
 
    ofstream ContainerSave(FileName, ios::out);
 
    for (int i=0; i < this->myCont->getLength(); i++)
    {
        ContainerSave << this->myCont->operator [](i) << "\n";
    }
 
    ContainerSave.close();
}
 
void MainWindow::on_pushButton_load_clicked()
{
    QString qsfilename = this->ui->plainTextEdit_load->toPlainText();
    if (qsfilename.size() == 0)
        return;
 
    // конвертация QString в char* ([url]http://stackoverflow.com/questions/5505221/converting-qstring-to-char[/url])
    QByteArray ba = qsfilename.toLatin1();
    const char *FileName = ba.data();
 
    ifstream ContainerLoad(FileName);
    this->myCont->erase();
И когда я запускаю программу появляется ошибка:
C:\Users\UserName\Desktop\1_work2\intcontainer.cpp:20: ошибка: no 'int& IntContainer::operator[](int)' member function declared in class 'IntContainer'
int& IntContainer::operator [](int contIndex)
^

Пожалуйста, подскажите. Заранее спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.12.2013, 14:30
Ответы с готовыми решениями:

Реализовать структуру User и написать функции записи в бинарный файл и чтения из бинарного файла
Нужно создать двоичный файл структур. Выдает кучу ошибок, помогите исправить, пожалуйста #include...

Класс записи/чтения матрицы в файл
Учу по немного С++, попробовал реализовать класс записи/чтения матрицы в файл struct IFile { ...

Класс для записи в файл и чтения из файла
Здравствуйте, у меня вот возникла такая проблема при выполнении домашнего задания: надо создать два...

Оформление свойства для чтения, класс-контейнер
Здравствуйте, помогите пожалуйста разобраться со свойством только для чтения у меня есть вот...

Как работает блокнот, если файл невоможно открыть одновременно для записи и чтения?
сабж... интересно.

4
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
16.12.2013, 14:48 2
объявить метод int& operator [](int contIndex) в классе IntContainer
1
zXus
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 75
16.12.2013, 17:28  [ТС] 3
Подскажите, как объявить этот метод в классе.
0
Elboy
131 / 112 / 11
Регистрация: 01.09.2012
Сообщений: 288
17.12.2013, 00:57 4
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
#ifndef INTCONTAINER_H
#define INTCONTAINER_H
 
#include <assert.h>
 
class IntContainer
{
public:
    IntContainer();
    IntContainer(int newLength);
    ~IntContainer();
 
    int& operator [](int contIndex); //new
 
     int getLength();
 
    void erase();
 
private:
    int contLength;
    int *contData;
};
 
#endif // INTCONTAINER_H
1
zXus
0 / 0 / 0
Регистрация: 12.12.2012
Сообщений: 75
17.12.2013, 18:43  [ТС] 5
Спасибо большое, заработал, но он сохраняет в текстовый файл. А мне нужно в бинарный. Подскажите, пожалуйста, что где поменять.
0
17.12.2013, 18:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.12.2013, 18:43

Как сохранить\прочитать контейнер в бинарный файл
ostream_iterator&lt;string, char&gt; out(cout, &quot;\n&quot;); set&lt;string&gt; mat; set&lt;string&gt; pat; ...

Запись и чтения класса в бинарный файл
Здраствуйте. Можете сказать как в c# можно организовать запись и чтения класса с любыми данными (к...

Как поток чтения (или записи) запихнуть в класс?
Здравствуйте!!! Ребят, подскажите пожалуйста, собственно, как запихнуть в класс поток ifstream?...


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

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

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