Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
#1

Как сохранить контейнеры STL в файл. И как потом их прочитать из файла - C++

05.04.2014, 10:58. Просмотров 1183. Ответов 17
Метки нет (Все метки)

В Qt такой контейнер как map<T,T> библиотеки STL заносится в файл занесением в поток "<<map;" , а как это можно сделать в C++ BUILDER6.0 или XE3???

Добавлено через 19 минут
Идея создать словарь и поэтому вторая переменная имеет несколько строк взятых из MEMO...

Через базу данных делать не хочу...
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 10:58
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сохранить контейнеры STL в файл. И как потом их прочитать из файла (C++):

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

Как правильно сохранить и потом считать структуру в бинарный файл - C++
Есть структура struct card { int size; char *lear; int *name; }; Эта структура это карты игрока. Заполняем ее данными, у...

Как stl контейнеры работают с объектами различных типов данных? - C++
Интересует определяют ли STL контейнеры (в частности vector) какой тип данных они хранят, для соответсвтующей работе с ними в памяти? Если...

Сохранить массив в файл а потом считать его из файла - C++
#include &lt;iostream&gt; using namespace std; int main() { setlocale (0,&quot;&quot;); const int str = 10; const int stolb = 10; int...

Как создать шаблон класса, который сможет принимать в качестве значения любые stl контейнеры - C++
Как написать класс, в который можно засунуть vector&lt;int&gt;, или vector&lt;float&gt;, или deque&lt;double&gt; и т.д?

Задача : сохранить несколько чисел в файле и потом их прочитать - C++
Задача : сохранить несколько чисел в файле (ну детский сад!) и потом их прочитать... Грабли начинаются с записи. Хотим писать в двоичном...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Sonyk91
110 / 111 / 4
Регистрация: 01.10.2012
Сообщений: 1,923
Завершенные тесты: 1
05.04.2014, 11:00 #2
hustler1987, сделайте вручную. Записывайте построчно ключ значение в файл. При условии, что вы не нашли оператора <<
0
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 11:04  [ТС] #3
Не получится... Вторая переменная содержит несколько строк из Memo1->Text занесенных в AnsiString, записать то смогу, а вот прочитать нет...
0
Sonyk91
110 / 111 / 4
Регистрация: 01.10.2012
Сообщений: 1,923
Завершенные тесты: 1
05.04.2014, 11:07 #4
hustler1987, поподробнее, не совсем понял...
0
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 11:49  [ТС] #5
В общем это программа англо-русского словаря:

за базу взят контейнер map;
вот так я объявляю и заполняю контейнер
C++
1
2
3
4
5
6
7
map<AnsiString, AnsiString> baza;
 
AnsiString slovo = Edit1->Text; //ключ
AnsiString Perevod = Memo1->Text; //тут несколько строк
 
baza[slovo] = Perevod;
//далее заполнение контейнера по аналогии
Как записать данный контейнер в файл и прочитать его???
0
Sonyk91
110 / 111 / 4
Регистрация: 01.10.2012
Сообщений: 1,923
Завершенные тесты: 1
05.04.2014, 12:09 #6
hustler1987, выложите полностью проект.

Добавлено через 7 минут
hustler1987, возьмите например эти две строки в кавычки и при чтении считывайте, то что внутри кавычек.
1
Croessmah
Эксперт CЭксперт С++
13226 / 7498 / 845
Регистрация: 27.09.2012
Сообщений: 18,416
Записей в блоге: 3
Завершенные тесты: 1
05.04.2014, 12:16 #7
можете сделать файл формата:
ключ#кол-во строк
строки из memo
или подобное
1
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 12:29 #8
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
#include <map>
#include <sstream>//äëÿ ГґГ*éëîâîãî i/o Г§Г*ìåГ*ГЁГІГј Г*Г* fstream
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    map<string, string> pData;
    pData[string("color1")] = "red";
    pData[string("color2")] = "grn";
    pData[string("color3")] = "blu";
 
    stringstream ss;//äëÿ ГґГ*éëîâîãî i/o áóäåò ofstream + ss.open(...)
    map<string, string>::iterator it;
 
    cout<<"INPUT : "<<endl;
    for( it = pData.begin(); it != pData.end(); it++ ){
        ss<<(*it).first<<endl<<(*it).second<<endl;
        cout<<(*it).first<<" -> "<<(*it).second<<endl;
    }
 
    string key;
    string value;
    map<string, string> pCopy;
        //Тут предполагается что мы открыли файл и читаем его до конца
    while( !ss.eof() )
    {
        ss>>key>>value;
        pCopy.insert(make_pair(key, value));
    }
 
    cout<<"OUT : "<<endl;
    for( it = pCopy.begin(); it != pCopy.end(); it++ ){
        cout<<(*it).first<<" -> "<<(*it).second<<endl;
    }
 
    return 0;
}
http://codepad.org/goQIYQDs
INPUT :
color1 -> red
color2 -> grn
color3 -> blu
OUT :
color1 -> red
color2 -> grn
color3 -> blu
1
Миниатюры
Как сохранить контейнеры STL в файл. И как потом их прочитать из файла  
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 15:54  [ТС] #9
-=ЮрА=-, а если Color1 содержит три цвета???
то есть:
AnsiString Key = Color1 //из Edit

AnsiString Value = Red, Green, Blue //из Memo

то есть на одно значение AnsiString ключа значение нескольких строк AnsiString perem = Memo1->Text;
???????????????
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:12 #10
А в примере сколько ключей?
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
pData[string("color1")] = "red";
* * pData[string("color2")] = "grn";
* * pData[string("color3")] = "blu";
- 3 ключа 3 значения
AnsiString это такой же масив чаров как и string аналогия чуть ли не прямая

Добавлено через 3 минуты

Не по теме:

ЗЫ и причём здесь GUI, который у тебя служит для пользовательского i/o

Цитата Сообщение от hustler1987 Посмотреть сообщение
AnsiString Key = Color1 //из Edit
AnsiString Value = Red, Green, Blue //из Memo

0
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 16:15  [ТС] #11
Вот так работает в QT сохранение map контейнера:
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
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QtCore>
#include <QtGui>
#include <QMessageBox>
#include <QFileDialog>
#include <QSystemTrayIcon>
 
#include "formslovoperevod.h"
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    //explicit FormSlovoPerevod(QWidget *parent = 0);
    ~MainWindow();
 
private:
    Ui::MainWindow *ui;
    FormSlovoPerevod *fsp;
    //Ui::MainWindow *FormSlovoPerevod;
public:
    QString FileOpen;
    QMap<QString,QString> map;
    void vivod();
public slots:
    void OnTimeout();
    void SelectSlovo();
private slots:
    void on_pushButtonAdd_clicked();
    void on_pushButtonClear_clicked();
    void on_actionOpen_triggered();
    void on_actionSave_triggered();
    void on_actionExit_triggered();
};
 
#endif // MAINWINDOW_H
//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
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
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "formslovoperevod.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{    
    ui->setupUi(this);
    this->setWindowTitle("Словарик");
    FileOpen = "baza.bin";
    QFile file(FileOpen);
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream stream(&file);
        stream>>map;
        if (stream.status() != QDataStream::Ok ) {
            QMessageBox::critical(0,"Ошибка чтения", "Чтение контейнера не было осуществлено");
        }
    }
    file.close();
    vivod();
    QTimer* timer = new QTimer(this);
    connect(timer,SIGNAL(timeout()), this,SLOT(OnTimeout()));
    timer->start(1000);
    connect(ui->listWidgetSlova,SIGNAL(itemSelectionChanged()),SLOT(SelectSlovo()));
    vivod();
    ui->actionOpen->setStatusTip(tr("Открыть файл словаря..."));
    ui->actionSave->setStatusTip(tr("Сохранить словарь в файл..."));
    ui->actionExit->setStatusTip(tr("Выход из программы"));
    QSystemTrayIcon* trayicon = new QSystemTrayIcon(this);
    QIcon* icontray = new QIcon(QPixmap(":/imgs/icontray.ico"));
    this->setWindowIcon(QIcon(":/imgs/icontray.ico"));
    trayicon->setIcon(*icontray);
    trayicon->setVisible(true);
    trayicon->show();
    fsp = new FormSlovoPerevod();
    fsp->show();
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::vivod()
{
    ui->listWidgetSlova->clear();
    QMapIterator<QString,QString> it(map);
    while (it.hasNext()){
        it.next();
        ui->listWidgetSlova->addItem(it.key());
    }
    ui->centralWidget->setStatusTip(tr("Всего слов: ") + QString::number(ui->listWidgetSlova->count()));
 
}
 
void MainWindow::OnTimeout()
{
 
}
 
void MainWindow::SelectSlovo()
{
    QListWidgetItem* item = ui->listWidgetSlova->currentItem();
    ui->TextEditPerevod->setText(map[item->text()]);
}
 
void MainWindow::on_pushButtonAdd_clicked()
{
    QString* slovo = new QString(ui->EditSlovoAdd->text());
    QString* perevod = new QString(ui->TextEditAdd->toPlainText());
    if (map.contains(*slovo)) {
        QMessageBox::critical(0,"Повторное добавление","Данное слово уже есть в базе данных");
    } else {
        map.insert(*slovo,*perevod);
        ui->listWidgetSlova->addItem(*slovo);
    }
    vivod();
}
 
void MainWindow::on_pushButtonClear_clicked()
{
    ui->EditSlovoAdd->clear();
    ui->TextEditAdd->clear();    
}
 
void MainWindow::on_actionOpen_triggered()
{
    FileOpen  = QFileDialog::getOpenFileName(this, "Открыть словарь", "", tr("Файл словаря(*.bin)"));
    if (FileOpen.isNull()) return;
    QFile file(FileOpen);
    if (file.open(QIODevice::ReadOnly)) {
        QDataStream stream(&file);
        stream>>map;
        if (stream.status() != QDataStream::Ok ) {
            QMessageBox::critical(0,"Ошибка чтения", "Чтение контейнера не было осуществлено");
        }
    }
    file.close();
    vivod();
}
 
void MainWindow::on_actionSave_triggered()
{
    FileOpen  = QFileDialog::getSaveFileName(0,"Сохранить словарь","",
                                                     tr("Файл словаря(*.bin)"));
    if (FileOpen.isNull()) return;
    if (!FileOpen.endsWith(".bin")) FileOpen.append(".bin");
    QFile file(FileOpen);
    if (file.open(QIODevice::WriteOnly)) {
        QDataStream stream(&file);
        stream<<map;
        if (stream.status() != QDataStream::Ok ) {
            QMessageBox::critical(0,"Ошибка записи", "Запись контейнера не была осуществлена");
        }
    }
    file.close();
}
 
void MainWindow::on_actionExit_triggered()
{
        this->close();
}

А как сохранение организовать в Builder???
0
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:16 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Вот код на 3 строковых субитема
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
#include <map>
#include <sstream>//äëÿ ГґГ*éëîâîãî i/o Г§Г*ìåГ*ГЁГІГј Г*Г* fstream
#include <string>
#include <iostream>
using namespace std;
 
int main()
{
    map<string, string> pData;
    pData[string("color1")] = "red ""grn ""blu ";
    pData[string("color2")] = "grn ""yel ""pur ";
    pData[string("color3")] = "blu ""wht ""blk ";
 
    stringstream ss;//äëÿ ГґГ*éëîâîãî i/o áóäåò ofstream + ss.open(...)
    map<string, string>::iterator it;
 
    cout<<"INPUT : "<<endl;
    for( it = pData.begin(); it != pData.end(); it++ ){
        ss<<(*it).first<<endl<<(*it).second<<endl;
        cout<<(*it).first<<" -> "<<(*it).second<<endl;
    }
 
    string key;
    string value;
    map<string, string> pCopy;
    while( !ss.eof() )
    {
        getline(ss, key);
        getline(ss, value);
        //ss>>key>>value;
        pCopy.insert(make_pair(key, value));
    }
 
    cout<<"OUT : "<<endl;
    for( it = pCopy.begin(); it != pCopy.end(); it++ ){
        cout<<(*it).first<<" -> "<<(*it).second<<endl;
    }
 
    return 0;
}

Не по теме:

Мне действительно не понятно что может быть легче чем работа с СТЛ-вскими контейнерами

2
Миниатюры
Как сохранить контейнеры STL в файл. И как потом их прочитать из файла  
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 16:45  [ТС] #13
-=ЮрА=-, спасибо... похоже на то, что я хотел увидеть... попробую отпишусь...
0
-=ЮрА=-
05.04.2014, 16:49
  #14

Не по теме:

hustler1987, советую написать большую часть кода без привязки к Qt а просто в стандарте С+11. Qt же использовать лишь для организации кросс платформенного GUI. Скажем зачем использовать

Цитата Сообщение от hustler1987 Посмотреть сообщение
QDataStream stream(&file);
если есть привычный fstream ?

0
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 18:38  [ТС] #15
-=ЮрА=-, Как я и думал AnsiString не равен String...

String str не приравнивается Memo1->Text;

Добавлено через 4 минуты
-=ЮрА=-, блин туплю все пока получается

Добавлено через 1 час 22 минуты
-=ЮрА=-, Записать наверное так да???
C++
1
2
3
4
5
6
7
8
9
10
11
void __fastcall TForm2::Button1Click(TObject *Sender)
{
    Slovo = Edit1->Text;
    Perevod = Memo1->Text;
    ofstream st;
    st.open("Baza.txt");
    for(it = baza.begin(); it != baza.end(); it++ ){
        st<<(*it).first.c_str()<<endl<<(*it).second.c_str()<<endl;
    }
    st.close();
}
А как считать туда же ну или в новый контейнер???
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 18:38
Привет! Вот еще темы с ответами:

Как из массива записать объекты в файл, а потом из файла в другой массив ? - C++
Подскажите как с помощью ofstream, ifstream, ios::binary надо записывать объекты в файл и читать их оттуда.

Как организовать код записи БД в файл и потом его прочтения из файла? - C++
Как можно организовать код записи БД в файл и потом его прочтения из файла? Просто на ПП задали такое заданьеце, и теперь надо на DevC++...

Как взять данные из файла и сохранить в файл? - C++
День добрый. Подскажите, как взять данные из файла и как сохранить данные в файл. Желательно на примере графа. Спасибо!

как занести значения в vector из файла и сохранить их в файл? - C++
Требуется написать класс для работы с текстовым файлом - проверка его состояния, позиция курсора, размер и т.д. С горем пополам наваял. ...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
05.04.2014, 18:38
Ответ Создать тему
Опции темы

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