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

Чтение из бинарного файла - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.67
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
22.12.2013, 18:14     Чтение из бинарного файла #1
Здравствуйте. У меня имеется некий класс Product, объекты которого хранятся в объекте класса Vector. Есть функция записи вектора в бинарный файл. Как мне теперь считать данные из этого файла в вектор?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Product {
    std::string name_;
    long kol_;
    std::string mesto_;
    float price_;
    std::string postav_;
public:
    ...
};
 
void Database::save(string file) {
        FILE* fout;
        const char* name = file.c_str();
        if (( fout = fopen(name, "wb")) == NULL ) {
                // нет файла
                return;
        }
        vector<Product>::iterator i = database_.begin();
        for (i; i != database_.end(); ++i) {
                fwrite(i, sizeof(i), 1, fout);
        }
        fclose(fout);
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2013, 18:14     Чтение из бинарного файла
Посмотрите здесь:

C++ Чтение из бинарного файла
чтение из бинарного файла C++
Чтение из бинарного файла C++
C++ Чтение из бинарного файла
C++ Чтение бинарного файла
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lpvoid
 Аватар для lpvoid
318 / 301 / 17
Регистрация: 06.03.2013
Сообщений: 869
22.12.2013, 18:18     Чтение из бинарного файла #2
Oberyn Martell, в каком формате записывали - в таком и считывайте. вам же виднее, вы писали. напишите подобие двоичного сериализатора.
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
22.12.2013, 18:32  [ТС]     Чтение из бинарного файла #3
lpvoid, то есть написать просто что-то наподобие этого не получится? :
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Database::zagruz(string file) {
        FILE* fout;
        const char* name = file.c_str();
        Product a;
        if (( fout = fopen(name, "r+b")) == NULL ) {
                // нет файла
                return;
        }
        vector<Product>::iterator i = database_.begin();
        database_.erase(database_.begin(), database_.end());
        while(!feof(fout)) {
                fread(&a, sizeof(a), 1, fout);
                database_.push_back(a);
        }
        fclose(fout);
}
lpvoid
 Аватар для lpvoid
318 / 301 / 17
Регистрация: 06.03.2013
Сообщений: 869
22.12.2013, 18:33     Чтение из бинарного файла #4
Oberyn Martell, as far as I know, нет.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 19:54     Чтение из бинарного файла #5
Oberyn Martell, у вас string в полях, поэтому бинарное чтение\запись, без дополнительных ухищрений (сериализация), не получится: Запись объектов в файл
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
23.12.2013, 09:21  [ТС]     Чтение из бинарного файла #6
Попробовал реализовать вот так вот, но значения считываются неправильно:
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
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
void Database::save(string file) {
        FILE* fout;
        file = file + ".bin";
        const char* name = file.c_str();
        if (( fout = fopen(name, "wb")) == NULL ) {
                // нет файла
                return;
        }
 
        int count;
        vector<Product>::iterator i = database_.begin();
        for(i; i != database_.end(); ++i) {
                count++;
        }
 
        fwrite(&count, sizeof(int), 1, fout);
        for(i = database_.begin(); i != database_.end(); ++i) {
                int
                        sizeName = i->getNameSize(),
                        sizeKol = i->getKolSize(),
                        sizeMesto = i->getMestoSize(),
                        sizePrice = i->getPriceSize(),
                        sizePostav = i->getPostavSize();
 
                fwrite(&sizeName, sizeof(int), 1, fout);
                fwrite(&sizeKol, sizeof(int), 1, fout);
                fwrite(&sizeMesto, sizeof(int), 1, fout);
                fwrite(&sizePrice, sizeof(int), 1, fout);
                fwrite(&sizePostav, sizeof(int), 1, fout);
 
                long kol = i->getKol();
                float price = i->getPrice();
 
                fwrite(&kol, sizeKol, 1, fout);
                fwrite(&price, sizePrice, 1, fout);
 
                char buf [1];
 
                strcpy(buf, i->getName().c_str());
                fwrite(&buf, sizeName, 1, fout);
 
                strcpy(buf, i->getMesto().c_str());
                fwrite(&buf, sizeMesto, 1, fout);
 
                strcpy(buf, i->getPostav().c_str());
                fwrite(&buf, sizePostav, 1, fout);
        }
        fclose (fout);
}
 
void Database::zagruz(string file) {
        int count = 0;
        long kol;
        float price;
        string name, mesto, postav;
        FILE* fout;
        file = file + ".bin";
        const char* nameFile = file.c_str();
        Product a;
        if (( fout = fopen(nameFile, "rb")) == NULL ) {
                // нет файла
                return;
        }
        fread(&count, sizeof(int), 1, fout);
        for(int i = 0; i < count; i++) {
                int
                        sizeName = 0,
                        sizeKol = 0,
                        sizeMesto = 0,
                        sizePrice = 0,
                        sizePostav = 0;
 
                fread(&sizeName, sizeof(int), 1, fout);
                fread(&sizeKol, sizeof(int), 1, fout);
                fread(&sizeMesto, sizeof(int), 1, fout);
                fread(&sizeMesto, sizeof(int), 1, fout);
                fread(&sizePrice, sizeof(int), 1, fout);
                fread(&sizePostav, sizeof(int), 1, fout);
 
                fread(&kol, sizeKol, 1, fout);
                fread(&price, sizePrice, 1, fout);
 
                char buf[1];
 
                fread(&buf, sizeName, 1, fout);
                name = buf;
 
                fread(&buf, sizeMesto, 1, fout);
                mesto = buf;
 
                fread(&buf, sizePostav, 1, fout);
                postav = buf;
 
                dobavProduct(name, kol, price, postav);
        }
        fclose(fout);
 
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 17:47     Чтение из бинарного файла #7
Цитата Сообщение от Oberyn Martell Посмотреть сообщение
char buf [1];
Вы в этот массив строки копируете?
Цитата Сообщение от Oberyn Martell Посмотреть сообщение
strcpy(buf, i->getName().c_str());
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 19:13     Чтение из бинарного файла
Еще ссылки по теме:

Чтение бинарного файла C++
Чтение бинарного файла C++
C++ Чтение из бинарного файла

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

Или воспользуйтесь поиском по форуму:
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
23.12.2013, 19:13  [ТС]     Чтение из бинарного файла #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы в этот массив строки копируете?
Дааааа
Чуть поправил, как ни странно, но все заработало -.-
Yandex
Объявления
23.12.2013, 19:13     Чтение из бинарного файла
Ответ Создать тему
Опции темы

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