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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.83
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
09.04.2011, 17:17     Бинарные файловые потоки #1
Нужно написать две функции, одна из них сохраняет перечень в бинарный файл, другая считает данные из этого же бинарного файла. Читал про бинарные файловые потоки, так и не могу понять как записать. Надо чтобы сохранились в файл по порядку данные типов 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 - сколько таких групп
Вложения
Тип файла: txt student.txt (357 байт, 14 просмотров)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.04.2011, 17:17     Бинарные файловые потоки
Посмотрите здесь:

C++ Файловые потоки и функции
Бинарные файловые потоки C++
C++ Файловые потоки
Файловые потоки C++
C++ Файловые потоки
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
09.04.2011, 18:17  [ТС]     Бинарные файловые потоки #2
исправление: название i-ой группы pb[i].name

Народ, хелп
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
09.04.2011, 21:42     Бинарные файловые потоки #3
Так, допустим перечень мы сформировали. Что он из себя представляет? Массив элементов типа
gruppa?
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17
10.04.2011, 11:16  [ТС]     Бинарные файловые потоки #4
да, тип gruppa. Но на данный момент используется только поле name (я уже писал что реализация не рациональная)
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
10.04.2011, 11:59     Бинарные файловые потоки #5
Так тебе надо загнать в бинарник массив элементов типа gruppa?
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

затем из этого же бинарного файла считать в те же переменные.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.04.2011, 13:03     Бинарные файловые потоки
Еще ссылки по теме:

файловые потоки C++
Файловые потоки C++
C++ Файловые потоки в Си и С++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
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;
};
Это ни один компилятор не схавает
Yandex
Объявления
10.04.2011, 13:03     Бинарные файловые потоки
Ответ Создать тему
Опции темы

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