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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
DJFile
0 / 0 / 0
Регистрация: 11.04.2010
Сообщений: 31
16.05.2010, 14:07     Чтение структуры из бинарного файла #1
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
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
124
125
126
127
128
129
130
#include "fstream"
#include "iostream"
#include "windows.h"
using namespace std;
 
struct scan_info{
    char model[25]; // наименование модели
    int price; // цена
    double x_size; // горизонтальный размер области сканирования
    double y_size; // вертикальный размер области сканирования
    int optr; // оптическое разрешение
    int grey; // число градаций серого
};
 
void write_file(const char *file_name, const unsigned short num_w);
int working_file(const char *file_name, const unsigned short num_w);
 
int main(){
    setlocale(LC_CTYPE, "Russian_Russia.1251");
    cout << "Создать новый файл? y/n ";
    char choice;
    unsigned short num_w;
    char file_name[15];
    do{
    cin >> choice;
    if (choice=='y'){
        cout << "Введите имя файла для записи:";
        cin.ignore(1);
        cin.getline(file_name,14);
        cout << "Введите число записей:";
        cin >> num_w;
        cin.ignore(1);
        write_file(file_name, num_w);
        break;
    }
    if (choice=='n') break;
    }
    while (choice!='y' || choice!='n');
    system("cls");
    cout << "Введите имя файла для чтения или q:";
    cin.ignore(1);
    cin.getline(file_name, 14);
    if (*file_name=='q') exit(1);
    cout << "Введите номер замещаемой записи:";
    cin >> num_w;
    working_file(file_name, num_w);
    system("pause");
    return 0;
}
 
void write_file(const char *file_name, const unsigned short num_w){
    scan_info *Scaners = new scan_info[num_w];
 
    /*Ввод структуры*/
    for(int i=0; i<num_w; i++){
        cout << "\nЗапись №"<<i+1;
        cout << "\nВведите модель:";
        cin.getline(Scaners[i].model, 24);
        Scaners[i].model[25]='\0';
        cout << "Введите цену:";
        cin >> Scaners[i].price;
        cout << "Введите горизонтальный размер области сканирования:";
        cin >> Scaners[i].x_size;
        cout << "Введите вертикальный размер области сканирования:";
        cin >> Scaners[i].y_size;
        cout << "Введите оптическое разрешение:";
        cin >> Scaners[i].optr;
        cout << "Введите число градаций серого:";
        cin >> Scaners[i].grey;
        cin.ignore(1);
    }
 
    /*Создание файла и запись в него*/
    ofstream fout(file_name, ios::out | ios::binary);
    if(fout.fail()){
        cerr << "Ошибка открытия выходного файл\n";
        system("pause");
        exit(1);
    }
    fout.write(reinterpret_cast<const char*>(&num_w), sizeof(short));
    for (int i=0; i<num_w; i++){
    fout.write(Scaners[i].model, sizeof Scaners->model);
    fout.write(reinterpret_cast<const char*>(&Scaners[i].price), sizeof Scaners->price);
    fout.write(reinterpret_cast<const char*>(&Scaners[i].x_size), sizeof Scaners->x_size);
    fout.write(reinterpret_cast<const char*>(&Scaners[i].y_size), sizeof Scaners->y_size);
    fout.write(reinterpret_cast<const char*>(&Scaners[i].optr), sizeof Scaners->optr);
    fout.write(reinterpret_cast<const char*>(&Scaners[i].grey), sizeof Scaners->grey);
    }
    fout.close();
}
 
int working_file(const char *file_name, const unsigned short num_w){
    fstream fin(file_name, ios::binary | ios::_Nocreate |ios::in | ios::out);
    fin.seekg(ios::beg);
    if(fin.fail()){
        cerr << "Ошибка открытия выходного файла\n";
        return -1;
    }
    unsigned short num;
    fin.read(reinterpret_cast<char*>(&num),sizeof (short));
    if (num_w>num){
        cerr << "Такой записи не существуе!\n";
        return -1;
    }
    scan_info Scaners_p;
    fin.seekg((num_w-1)*sizeof Scaners_p, ios::cur);
    fin.read(Scaners_p.model,sizeof Scaners_p.model);
    fin.read(reinterpret_cast<char*>(&Scaners_p.price), sizeof Scaners_p.price);
    fin.read(reinterpret_cast<char*>(&Scaners_p.x_size), sizeof Scaners_p.x_size);
    fin.read(reinterpret_cast<char*>(&Scaners_p.y_size), sizeof Scaners_p.y_size);
    fin.read(reinterpret_cast<char*>(&Scaners_p.optr), sizeof Scaners_p.optr);
    fin.read(reinterpret_cast<char*>(&Scaners_p.grey), sizeof Scaners_p.grey);
 
    cout << "\nЗапись №"<<num_w;
    cout << "\nМодель:";
    cout << Scaners_p.model;
    cout << "\nЦена:";
    cout << Scaners_p.price;
    cout << "\nГоризонтальный размер области сканирования:";
    cout << Scaners_p.x_size;
    cout << "\nВертикальный размер области сканирования:";
    cout << Scaners_p.y_size;
    cout << "\nОптическое разрешение:";
    cout << Scaners_p.optr;
    cout << "\nЧисло градаций серого:";
    cout << Scaners_p.grey << endl;
    cin.ignore(1);
    fin.close();
    return 0;
}
Программа записывает все введённые данные, но вывести может только 1ю запись, на всех остальных считывание по байтам как бы "уезжает". Помогите.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.05.2010, 14:07     Чтение структуры из бинарного файла
Посмотрите здесь:

Чтение из бинарного файла C++
Чтение бинарного файла C++
Чтение 10-ой структуры из бинарного файла C++
C++ Чтение из бинарного файла
Чтение структуры из бинарного файла в массив C++
C++ Чтение структуры из бинарного файла
Чтение структуры из бинарного файла C++
C++ Чтение из бинарного файла

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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