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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Может ли объемлющий класс иметь неограниченный доступ к элементам вложенного класса? А вложенный класс — к элементам объемлющего? http://www.cyberforum.ru/cpp-beginners/thread273065.html
Ответ как бы знаю(нет , да). но наверное я что-то не так понимаю, т.к. примерчик написать не получается. class BaseClass { public: class BaseClassClass; void baseHello() { std::cout << "123"; }; };
C++ Прокрутка текста Добрый день всем! Помогите, пожалуйста, тупой мне. Как реализовать прокрутку текста в label в Visual C++ или Visual C#? http://www.cyberforum.ru/cpp-beginners/thread273058.html
C++ Быки и коровы
Решил написать игру Быки и коровы, но уже в самом начале появились проблемы. я сделал функцию, которая считает количество быков, т.е. одинаковых чисел, стоящих на той же самой позиции. Но компилятор выдает ошибку. вычисления фрагмента не является функция, принимающая 2 аргументов #include <iostream> #include <ctime> #include <cstdlib> // для генерации случайных чисел #define N 4
Ошибка доступа к полю C++
#include <iostream> using namespace std; int i = 0; class CDate { protected: int Year; int Month;
C++ программа для нахождения нулей функции http://www.cyberforum.ru/cpp-beginners/thread273020.html
ребят нужна срочно программа для нахождения нулей функции y(x)=x^2-2*ln*(x+1) с заданной точностью.
C++ Простановка чисел на координатных осях... Пишу класс на Qt для вывода графиков, никак не могу придумать нормальный алгоритм для проставления чисел на осях... т.е. левое число double и правое double, нужно взять между ними n (3-10) "красивых" чисел, уверен, алгоритм заезженный и у кого-то есть готовое решение... подробнее

Показать сообщение отдельно
isgat
0 / 0 / 0
Регистрация: 18.11.2010
Сообщений: 17

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

09.04.2011, 17:17. Просмотров 1487. Ответов 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 - сколько таких групп
Вложения
Тип файла: txt student.txt (357 байт, 14 просмотров)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru