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

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

Восстановить пароль Регистрация
 
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 10:58     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #1
В Qt такой контейнер как map<T,T> библиотеки STL заносится в файл занесением в поток "<<map;" , а как это можно сделать в C++ BUILDER6.0 или XE3???

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

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

C++ Как правильно сохранить и потом считать структуру в бинарный файл
C++ Сохранить массив в файл а потом считать его из файла
C++ Задача : сохранить несколько чисел в файле и потом их прочитать
C++ как занести значения в vector из файла и сохранить их в файл?
C++ как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Sonyk91
 Аватар для Sonyk91
103 / 103 / 4
Регистрация: 01.10.2012
Сообщений: 1,806
05.04.2014, 11:00     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #2
hustler1987, сделайте вручную. Записывайте построчно ключ значение в файл. При условии, что вы не нашли оператора <<
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 11:04  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #3
Не получится... Вторая переменная содержит несколько строк из Memo1->Text занесенных в AnsiString, записать то смогу, а вот прочитать нет...
Sonyk91
 Аватар для Sonyk91
103 / 103 / 4
Регистрация: 01.10.2012
Сообщений: 1,806
05.04.2014, 11:07     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #4
hustler1987, поподробнее, не совсем понял...
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 11:49  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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;
//далее заполнение контейнера по аналогии
Как записать данный контейнер в файл и прочитать его???
Sonyk91
 Аватар для Sonyk91
103 / 103 / 4
Регистрация: 01.10.2012
Сообщений: 1,806
05.04.2014, 12:09     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #6
hustler1987, выложите полностью проект.

Добавлено через 7 минут
hustler1987, возьмите например эти две строки в кавычки и при чтении считывайте, то что внутри кавычек.
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11846 / 6825 / 771
Регистрация: 27.09.2012
Сообщений: 16,920
Записей в блоге: 2
Завершенные тесты: 1
05.04.2014, 12:16     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #7
можете сделать файл формата:
ключ#кол-во строк
строки из memo
или подобное
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 12:29     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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
Миниатюры
Как сохранить контейнеры STL в файл. И как потом их прочитать из файла  
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 15:54  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #9
-=ЮрА=-, а если Color1 содержит три цвета???
то есть:
AnsiString Key = Color1 //из Edit

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

то есть на одно значение AnsiString ключа значение нескольких строк AnsiString perem = Memo1->Text;
???????????????
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:12     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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

hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 16:15  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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???
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 16:16     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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;
}

Не по теме:

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

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

Не по теме:

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

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

hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 18:38  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #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();
}
А как считать туда же ну или в новый контейнер???
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 18:49     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #16
Цитата Сообщение от hustler1987 Посмотреть сообщение
А как считать туда же ну или в новый контейнер???
- это тебе видней как и что используешь, я считывал в новую мапу предполагая, что чтение осуществляется в другом блоке кода и он(блок), никак не связан по данным (кроме файла) с с блоком в котором изначально родилась карта. Если же ты делаешь сериализацию, то конечно же, следует сразу считывать в используемую алгоритмом карту.
hustler1987
0 / 0 / 0
Регистрация: 22.05.2013
Сообщений: 11
05.04.2014, 19:22  [ТС]     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #17
-=ЮрА=-,
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
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();
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button2Click(TObject *Sender)
{
    map<String, String> baza2;
    map<String, String>::iterator it2;
    String Slovo = "";
    String Perevod = "";
    ifstream st;
    st.open("Baza.txt");
    while (!st.eof()){
         st>>Slovo<<endl;
         st>>Perevod<<endl;
         st>>baza.insert(make_pair(key, value));
    }
    st.close();
}
устал... что не так... как считать.. или не правильно записал????

Добавлено через 37 секунд
map<String, String> baza;
map<String, String>::iterator it;
String Slovo;
String Perevod;

Добавлено через 12 минут
-=ЮрА=-, Короче я не понимаю теперь до какого момента идет запись и чтение в потоке...и при записи контейнеров STL ставит ли он какие нибудь разграничители в файле для будущего чтения из него...

Добавлено через 15 минут
-=ЮрА=-, у меня нет getline
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.04.2014, 19:33     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла
Еще ссылки по теме:

Как сохранить\прочитать контейнер в бинарный файл C++
Контейнеры STL C++
C++ Как взять данные из файла и сохранить в файл?

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
05.04.2014, 19:33     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла #18
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
ss<<(*it).first<<endl<<(*it).second<<endl;
Цитата Сообщение от hustler1987 Посмотреть сообщение
-=ЮрА=-, Короче я не понимаю теперь до какого момента идет запись и чтение в потоке...и при записи контейнеров STL ставит ли он какие нибудь разграничители в файле для будущего чтения из него...
разграничители ты ставишь сам, если внимательно посомтришь то у меня разграничителем был endl
При этом здесь
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
getline(ss, key);
* * * * getline(ss, value);
(для орпеделённости будем вести речь о первом итеме карты) чтение шло построчно, считавался ключ "color1" и строка с пробелами в которой были "red grn blu " можно было бы писать и ключ и итемы скажем через ; тогда считать сожержимое файла от текущей позиции до ; можно было бы так
getline(ss, str, ';');

Добавлено через 3 минуты
Цитата Сообщение от hustler1987 Посмотреть сообщение
while (!st.eof()){
* * * * *st>>Slovo<<endl;
* * * * *st>>Perevod<<endl;
* * * * *st>>baza.insert(make_pair(key, value));
* * }
тут неверно я же специально написал getline и endl зачем пытался в полток чтения всавить?endl нужен был при записи чтобы когда считывали можно было различать где ключ а где содержимое

Добавлено через 2 минуты
Цитата Сообщение от hustler1987 Посмотреть сообщение
-=ЮрА=-, у меня нет getline
- как это нет, это стандартный метод!

Добавлено через 1 минуту
hustler1987, не в обиду разберись с STL
http://www.cplusplus.com/reference/s...tring/getline/
http://www.cplusplus.com/reference/i...tream/getline/

также используй нормлаьный чаровский контейнер std::string а не то что у тебя сейчас в коде под типом String
Yandex
Объявления
05.04.2014, 19:33     Как сохранить контейнеры STL в файл. И как потом их прочитать из файла
Ответ Создать тему
Опции темы

Текущее время: 13:42. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru