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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
DJFile
0 / 0 / 0
Регистрация: 11.04.2010
Сообщений: 31
#1

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

16.05.2010, 14:07. Просмотров 1253. Ответов 0
Метки нет (Все метки)

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++
#include &lt;iostream&gt; #include &lt;fstream&gt; #include &lt;string&gt; using namespace std; int main(void) { setlocale (0,&quot;&quot;); ...

Чтение структуры из бинарного файла - C++
Не работает, вроде все верно. #include &quot;stdafx.h&quot; #include &lt;conio.h&gt; #include &lt;iostream&gt; using namespace std; int main() ...

Чтение 10-ой структуры из бинарного файла - C++
Здравствуйте как это реализовать, не перебирая все структуры.

Запись и чтение структуры из бинарного файла - C++
Проблема заключается в том, что, когда идёт запись и считка с бин. файла - нормально выводит лишь первый элемент,а второй и тд. - иные...

Чтение структуры из бинарного файла в массив - C++
Структура выглядит так: struct StandardBook { char ISBN; //регистрационный номер книги International Standard Book Number char...

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется - C++
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.05.2010, 14:07
Привет! Вот еще темы с ответами:

Чтение из бинарного файла - C++
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...

Чтение из бинарного файла - C++
Ну собственно,у меня есть некий двоичный файл,в него записана моя информация в двоичном виде,требуется считать эту информацию и вывести на...

Чтение из бинарного файла - C++
Всем приветы. Подскажите или помогите, пожалста. Есть вот такая штука: #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include...

Чтение бинарного файла - C++
Здравствуйте. Есть код чтения бинарного файла: FILE *f; string tmp; char buff = {0}; f = fopen(&quot;data.bin&quot;, &quot;rb&quot;); if(f ==...


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

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

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