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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
#1

Бинарные файловые потоки - C++

09.04.2011, 17:17. Просмотров 1500. Ответов 6
Метки нет (Все метки)

Нужно написать две функции, одна из них сохраняет перечень в бинарный файл, другая считает данные из этого же бинарного файла. Читал про бинарные файловые потоки, так и не могу понять как записать. Надо чтобы сохранились в файл по порядку данные типов int, char, char, char и т.д.. У меня не выходит.

Вот программа почти готовая без этих двух функций.

Смысл программы в том что она формирует перечень групп в которых максимальное кол-во студентов из исходной таблицы, которую мы вывели из файла(этот файл во вложении, написан чисто для проверки)

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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
#include <stdlib.h>
#include <iostream>
#include <string.h>
#include <fstream>
#include <iomanip>
#include <conio.h>
#include <windows.h>
const int L=15;
using namespace std;
 
 
struct fio {
    char fam[L];
    char im[L];
    char ot[L];
};
 
struct student {
    fio fio;
    char group[L];
    int ball;
};
 
struct gruppa {
    char name[L];
    int ng;
};
 
void inputStudent(student *&px, int &n);
void outputStudent(student x[], int n);
void perechGruppa(student x[], int n, gruppa *&py, int &k);
void outputGruppa(gruppa y[], int max, int n);
void exitpr();
 
//Вывод пунктов меню
void PrintMenu() {
    system("cls");
    cout<<"1. Ввод из файла.\n";
    cout<<"2. Просмотр файла.\n";
    cout<<"3. Формирование перечня.\n";
    cout<<"4. Просмотр перечня.\n";
    cout<<"5. Сохранение перечня в бинарном файле.\n";
    cout<<"6. Вывод перечня из бинарного файла.\n";
    cout<<"7. Выход.\n\n\n";
}
 
 
void inputStudent(student *&px, int &n) {
    ifstream fin;
    char file[L];
    student t;
    int i;
    n=0;
    PrintMenu();
    cout<<"Введите название или путь файла: "; cin>>file;
 
    fin.open(file);
    if (fin.fail()) { 
        cout<<"Файл "<<file<<" не открывается."; 
        _getch(); 
        px=NULL; 
        return; 
    }
 
    do {
        fin>>t.fio.fam>>t.fio.im>>t.fio.ot>>t.group>>t.ball;
        n++;
    } while (fin.good());
 
    fin.close();
 
    if (px!=NULL) delete []px;
    px=new student[n];
 
    if (px==NULL) {
        cout<<"Нет памяти.\n"; 
        _getch(); 
        delete []px;
        px=NULL;
        n=0;
        return;
    }
 
    fin.open(file);
    if (fin.fail()) {
        cout<<"Файл "<<file<<" не открывается.";
        _getch();
        delete []px;
        px=NULL;
        n=0;
        return;
    }
        for (i=0;i<n;i++) fin>>px[i].fio.fam>>px[i].fio.im>>px[i].fio.ot>>px[i].group>>px[i].ball;
        fin.close();
 
        cout<<"Файл "<<file<<" введен.\n";
        _getch();
}
 
void outputStudent(student x[], int n) {
    if (n==0) {cout<<"Нет данных. Для начала введите файл."; _getch(); return;}
    cout<<"----------------------------------------------------------------------"<<endl;
    cout<<"| #  |    Фамилия    |    Имя    |    Отчество    |  Группа  | Баллы |"<<endl;
    cout<<"----------------------------------------------------------------------"<<endl;
    for (int i=0; i<n; i++) {
        cout<<left << "| "<< setw(2) <<i+1<<" | "<< setw(14) << x[i].fio.fam << "| "<< setw(10)<< x[i].fio.im <<"| "<< setw(15) << x[i].fio.ot <<"| "<<setw(9)<< x[i].group <<"| "<< setw(6)<< x[i].ball <<"| "<<endl;
    }
    cout<<"----------------------------------------------------------------------"<<endl;
    _getch();
}
 
//Функция формирования перечня. Прошу не обращать внимания что код написано очень плохо, в плане рациональности. Времени было мало, я написал на скорую руку под готовую функцию.
void perechGruppa(student x[], int n, gruppa *&py, int &max, int &nm) {
    if (n==0) {cout<<"Нет данных. Для начала введите файл."; _getch(); return;}
    int i,j,fl;
    gruppa *y;
    int k=0;
    y=new gruppa[n];
    if (y==NULL) { cout<<"Нет памяти.\n"; py=NULL; return; }
    for (i=0; i<n;i++) {
        fl=1;
        for (j=0;j<k;j++)  
            if (strcmp(x[i].group,y[j].name)==0) {fl=0; y[j].ng++; break; }
            if (fl==1) {strcpy_s(y[k].name,x[i].group); y[k].ng=1; k++; }  }
            if (py!=NULL) delete[]py;
 
            py=new gruppa [k];
            if (py==NULL) {cout<<"Нет памяти!\n"; _getch(); k=0; delete[]y; return; }
 
            nm=0;
            strcpy_s(py[nm].name,y[0].name); max=y[0].ng;
            for (i=1; i<k; i++) {
                if (y[i].ng==max) { nm++; strcpy_s(py[nm].name,y[i].name); }
                if (y[i].ng>max) {
                    nm=0; max=y[i].ng;
                    strcpy_s(py[nm].name,y[i].name);
                }
            }
            delete []y;
            cout<<"Перечень создан. \n"; _getch();
    }
 
void outputGruppa(gruppa y[], int max, int n) {
    if (max==0) {cout<<"Нет данных. Для начала сформируйте перечень."; _getch(); return;}
    cout<<"--------------------------------------------------------------"<<endl;
    cout<<"| Максимальное кол-во студетов в одной группе: "<<left<<setw(14)<<max<<"|"<<endl;
    cout<<"--------------------------------------------------------------"<<endl;
    cout<<"| Группы:          | "<<setw(40)<<y[0].name<<"|"<<endl;
    for (int i=1; i<=n; i++) {
        cout<<"|                  | "<<setw(40)<<y[i].name<<"|"<<endl;
    }
    cout<<"--------------------------------------------------------------"<<endl;
    _getch();
}
 
 
void exitpr() {
    char c='0'; //Клавиша выхода из программы
    cout<<"\n\n\n\t\t\tВы действительно хотите выйти? y/n: \n\n\n";
    while ((c!='y') && (c!='n'))
    c=_getch();
    if (c=='y') exit(1);
}
 
void main () {
    student *pa;
    gruppa *pb, *pc;
    int n,m,max,lc;
    n=m=max=lc=0;
    pa=NULL;
    pb=NULL;
    pc=NULL;
 
    setlocale(0,"rus");
 
    while(1) {
    PrintMenu();
    char menu;
    PrintMenu();
    menu=_getch();
    while (menu < '1' || menu > '7') {
    cout<<"Нажмите от 1 до 7\n";
    menu=_getch();
    system("cls");
    PrintMenu();
 
    }
    switch (menu){
        case '1': inputStudent(pa,m); break;
        case '2': outputStudent(pa,m); break;
        case '3': perechGruppa(pa,m,pb,max,n); break;
        case '4': outputGruppa(pb,max,n); break;
        case '5': ;
        case '6': ;
        case '7': exitpr();
    }
    }
}
Входные переменные в функциях (pb,max,n). pb - названия групп, max - кол-во студентов в них, n - сколько таких групп
0
Вложения
Тип файла: txt student.txt (357 байт, 14 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2011, 17:17
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Бинарные файловые потоки (C++):

Бинарные файловые потоки - C++
Существует ли стандартный вариант? Как обозван тип такого потока для записи? Для чтения? Чтоб бинарники писать операторами типа so&lt;&lt;d; (so...

Файловые потоки - C++
Компилятор ругается при создании экземпляра класса ofstream. Среда разработки - Visual C++ 2008. Выдает error C2079: 'fileout' uses...

файловые потоки - C++
Помогите найти ошибку! Программа из книги Дейтелов!Не понимаю что я пропустил .. ------ Построение начато: проект: potok,...

Файловые потоки - C++
Структура enum status {Boss=1, Manager}; struct Worker { string Name; int Year; ...

Файловые потоки в Си и С++ - C++
Вот код. Нужно использовать чтение из файла и запись в файл, такое же как и в языке СИ (без использования библиотек которых нет в СИ). Я...

Файловые потоки - C++
Для каждого автобуса автопарка укажите его номер, маршрут, фамилию и инициалы шофера, время в пути. Предусмотреть поиск по фамилии шофера.

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
09.04.2011, 18:17  [ТС] #2
исправление: название i-ой группы pb[i].name

Народ, хелп
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
09.04.2011, 21:42 #3
Так, допустим перечень мы сформировали. Что он из себя представляет? Массив элементов типа
gruppa?
0
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
10.04.2011, 11:16  [ТС] #4
да, тип gruppa. Но на данный момент используется только поле name (я уже писал что реализация не рациональная)
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
10.04.2011, 11:59 #5
Так тебе надо загнать в бинарник массив элементов типа gruppa?
0
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
10.04.2011, 12:24  [ТС] #6
да, в такой последовательности: max pb[0].name pb[1].name pb[2].name ... pb[n].name

затем из этого же бинарного файла считать в те же переменные.
0
kravam
быдлокодер
1695 / 882 / 45
Регистрация: 04.06.2008
Сообщений: 5,460
10.04.2011, 13:03 #7
Ну вот проверяй загон в файл, я бы сам проверил, да в лом инициализировать перечень
C++
1
2
3
4
5
6
void zapis_v_bin_fail  (gruppa* _pb, int n) {
 fstream file("real.bin", ios_base::binary | ios_base::out | ios_base::trunc);
 for (int i= 0; i<= n; i++) 
  file.write((char*)_pb[i].name, L);
 file.close ();
}
n это количество групп.
Да, ещё везде поисправляй:
C++
1
2
3
4
5
struct student {
        [B]fio fio[/B];
        char group[L];
        int ball;
};
Это ни один компилятор не схавает
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 13:03
Привет! Вот еще темы с ответами:

Файловые потоки - C++
1 задача) Дан текстовый файл. Напечатать все строки, в которых имеется хотя бы один пробел. 2 задача) Дан файл f, элементами которого...

Файловые потоки и функции - C++
Скажите пожалуйста, как передать файловый поток в функцию?

Файловые указатели. Потоки - C++
Вот какой вопрос у меня появился. Пусть есть 2 указателя, связанных с одним и тем же файлом открытым в режиме read. Если я считываю...

Файловые потоки данных - C++
Помогите, пожалуйста! Надо написать программу, которая считывает из файла строки и сохраняет их в другой файл в обратном порядке. Я...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
10.04.2011, 13:03
Ответ Создать тему
Опции темы

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