Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
#1

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

22.12.2013, 18:14. Просмотров 1235. Ответов 7
Метки нет (Все метки)

Здравствуйте. У меня имеется некий класс 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);
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.12.2013, 18:14
Ответы с готовыми решениями:

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание...

Чтение бинарного файла
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.)...

Чтение бинарного файла
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char...

Чтение бинарного файла
Привет! Необходима помощь в таком вопросе - Создал программу для хранения...

Чтение из бинарного файла
Добрый вечер.Возникла проблема при чтении имени объекта из бинарного...

7
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
22.12.2013, 18:18 #2
Oberyn Martell, в каком формате записывали - в таком и считывайте. вам же виднее, вы писали. напишите подобие двоичного сериализатора.
0
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);
}
0
lpvoid
322 / 305 / 59
Регистрация: 06.03.2013
Сообщений: 869
22.12.2013, 18:33 #4
Oberyn Martell, as far as I know, нет.
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
22.12.2013, 19:54 #5
Oberyn Martell, у вас string в полях, поэтому бинарное чтение\запись, без дополнительных ухищрений (сериализация), не получится: Запись объектов в файл
1
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);
 
}
0
alsav22
5442 / 4837 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
23.12.2013, 17:47 #7
Цитата Сообщение от Oberyn Martell Посмотреть сообщение
char buf [1];
Вы в этот массив строки копируете?
Цитата Сообщение от Oberyn Martell Посмотреть сообщение
strcpy(buf, i->getName().c_str());
0
Oberyn Martell
5 / 5 / 0
Регистрация: 15.05.2013
Сообщений: 36
23.12.2013, 19:13  [ТС] #8
Цитата Сообщение от alsav22 Посмотреть сообщение
Вы в этот массив строки копируете?
Дааааа
Чуть поправил, как ни странно, но все заработало -.-
0
23.12.2013, 19:13
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.12.2013, 19:13

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

Чтение бинарного файла
Помогите, пожалуйста, научите, как правильно читать файлы! Есть бинарный файл....

Чтение из бинарного файла
Всем приветы. Подскажите или помогите, пожалста. Есть вот такая штука: ...


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

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

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