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
| //*
//Для хранения данных о ноутбуках описать структуру.
//Написать функцию, которая читает данные о ноутбуках из файла note.txt в структуру. Написать функцию, которая записывает содержимое структуры в конец бинарного файла. Структура бинарного файла:
//первые два байта — целое число записей в файле;
//далее записи в формате структуры NOTEBOOK.
//Написать программу, в которой на основе разработанных функций осуществляется запись в двоичный файл данных только о тех ноутбуках, объем HDD которых больше 1 Гбайт, отсортированных в порядке возрастания размера диагонали дисплея.
//
//Для хранения данных о ноутбуках описать структуру вида:
//struct NOTEBOOK {
// struct dlsp_resf // разрешающая способность дисплея
// int x; // по горизонтали
// int у; // по вертикали
// int f; // частота регенерации
// float d; // размер диагонали дисплея
// float hdd; // объем диска
// char model[21]; // наименование
//}
//-----------------------------------------------------*/
#include <stdio.h> //содержит стандартные функции файлового ввода-вывода
#include <io.h> //для работы с файлами
#include <conio.h> // функции для работы с консолью
#include <process.h> //для очистки экрана
#include <locale.h> // подключение setlocale
#include <malloc.h> // Функции для манипулирования динамической памятью
#include <string.h> // для работы со строками
#include <fcntl.h.> //работы с функциями дискриптора
#include <stdlib.h> //содержит функции преобразования строк
struct dlsp_resf { //объявляем структуру "разрешающая способность дисплея"
char model[21]; // наименование
int x; // по горизонтали
int у; // по вертикали
int f; // частота регенерации
float d; // размер диагонали дисплея
float hdd; // объем диска
};
typedef struct notebook { //объявляем структуру "ноутбук"
char model[21]; //название модели
struct dlsp_resf s; //способность дисплея
} NB; //вводим новый тип - NB
NB a; //переменная a является типом NB
// --------------------- объявляем функции
float func_preobr(char *st, int start) //функция преобразования строки в число
{
//char *buf_d;//буфферный массив
char *buf_hdd;//буфферный массив
int i,j;
//buf_d = new char [4];
buf_hdd = new char [5];// Захват памяти
//if (buf_d==NULL) {puts("Ошибка при создании массива строки"); _getch(); return 0;}
//for (i=0;i<5;i++) //обработка строки из 5-ти символов
//*(buf_d+i)=st[start+i]; //присваиваем буфферной строке значение размера диагонали
if (buf_hdd==NULL) {puts("Ошибка при создании массива строки"); _getch(); return 0;}
for (j=0;j<6;j++) //обработка строки из 6-ти символов
*(buf_hdd+j)=st[start+j]; //присваиваем буфферной строке значение объема диска
//return atof(buf_d); // переводим стринг в дабл
return atof(buf_hdd); // переводим стринг в дабл
}
void func_pokaz (int sz, NB a) { // объявляем функцию просмотреть файл
system("cls"); //очистка экрана
FILE *f1;
int i;
unsigned short q; //переменная "количество записей"
if (!(f1 = fopen("d:\\kr2.bin","rb"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу"); _getch(); return;}
printf("\Файл имеет следующие данные:\n");
fread(&q,2,1,f1); //чтение первых двух байт об количестве записей в файле
printf("число записей в файле = %d",q);
while(fread(&a, sz,1,f1)) //чтение файла поструктурно
{ if(feof(f1)) break; //если достигнут конец файла выйти из цикла
printf("\n%s %.1lf %dx0%dPPI %dГц %.3lfГб", a.model,a.s.d,a.s.x,a.s.у,a.s.f,a.s.hdd); //вывод данных на экран
}
fclose(f1);
return;
}
void f_write(char *st, int sz, NB a) //функция записи данных в файл
{
FILE *f2;
int i;
for (i=0; i<19; i++) //запись имени состоящем из 20-ти симоволов
a.model[i]=*(st+i);
a.s.d=func_preobr(st,51); //запись диагонали
a.s.x=func_preobr(st,58); //запись по горизонтали х
a.s.у=func_preobr(st,63); //запись по вертикали y
a.s.f=func_preobr(st,68); //запись частота регенерации f
a.s.hdd=func_preobr(st,71);//запись объема диска (через функцию преобразования) в промежуточную структуру "а"
if (!(f2 = fopen("d:\\kr2.bin","a+b"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу");_getch(); return;}
fwrite(&a,sz,1,f2); //запись структуры в файл
fclose(f2);
}
unsigned short f_zad(unsigned short x2, int sz, NB a) //отбор и запись в файл данных по условию
{
system("cls");
int i, k, buf;
char *st, *buf_hdd, *buf_d; //указатели на считаную строку и буфферную строку (диагонали)
double hdd,d=0; //переменная "величина диагонали"
FILE *f1;
buf_hdd = new char [5]; // Захват памяти
buf_d = new char [4];
st = new char [100]; // Захват памяти
if (buf_hdd==NULL && buf_d==NULL) {puts("Ошибка при создании массива строки"); _getch(); return x2;} //NULL - при нехватке памяти
if (st==NULL) {puts("Ошибка при создании массива строки"); _getch(); return x2;}
fflush(stdin); //Явная очистка буфера ОС
if (!(f1 = fopen("d:\\note.txt","r+t"))) { //проверка откртылся ли файл
puts("Ошибка открытия файла! Нажмите любую клавишу");_getch(); return x2;}
while (fgets (st,79,f1)) //построчно читаем файл в цикле пока не встретим EOF
{ *(buf_hdd+0)=st[71]; //присваиваем буфферной строке объем диагонали
*(buf_hdd+1)=st[72];
*(buf_hdd+2)=st[73];
*(buf_hdd+3)=st[74];
*(buf_hdd+4)=st[75];
*(buf_d+0)=st[51];
*(buf_d+1)=st[52];
*(buf_d+2)=st[53];
*(buf_d+3)=st[54];
hdd=atof(buf_hdd); // переводим стринг в дабл
d=atof(buf_d);
for (int i = 0; i <d ; i++) {
for(int j = i + 1; j < d; j++) {
if (buf_d[i] > buf_d[j])
/*buf=buf_d[i];
buf_d[i]=buf_d[j];
buf_d[j]=buf;*/
(buf_d[i], buf_d[j]);
}
}
if (hdd>1) //если выполняется условие что HDD > 1 gb - записать их в файл
{f_write(st, sz, a); //вызов функции записи в двоичный файл
x2++; //увеличиваем счетчик записей в файле
} }
//delete buf_d;
delete []st; // Освобождение памяти
f1 = fopen("d:\\kr2.bin","r+b"); //далее запишем изменение в количестве записей в фале (первые два байта)
fseek(f1,0,0); //смещение указателя в начало файла
fwrite(&x2,2,1,f1); //запись в первые два байта - "число записей"
fclose(f1); //закрытие файла
return x2; //возврат значения числа записей в файле в основную программу
}
// --------------------- объявляем переменные
int sz; //размер в байтах структуры notebook
unsigned short x1=0; //число записей файле
void main(){
FILE *f1;
setlocale(LC_CTYPE, "Russian"); //Установка поддержки русского языка
sz=sizeof(notebook); //находим размер структуры notebook
if (!(f1 = fopen("d:\\kr2.bin","rb"))) { //если файла нет то
f1 = fopen("d:\\kr2.bin","w+b"); //создать файл
fwrite(&x1,2,1,f1); //запись в первые два байта - "0 записей"
} else //если файл существует то:
{
f1 = fopen("d:\\kr2.bin","r+b"); //открыть файл для чтения
fread(&x1,2,1,f1); //чтение первых двух байт об количестве записей в файле
fclose(f1);
while (1) { //организация бесконечного цикла
int menu_n1=0;
system("cls"); //очистка экрана
puts ("Выберите вариант меню");
puts ("1 - Дописать в файл информацию о ноутбуках");
puts ("2 - Просмотр целочисленного бинарного файла");
puts ("3 - Выйти из программы");
fflush(stdin); // Явная очистка буфера ОС
printf("\nВведите пункт меню: ");
scanf_s("%d", &menu_n1);
switch(menu_n1) //меню
{
case 1: x1=f_zad(x1, sz, a); break; //вызов функции чтения текстового файла
case 2: func_pokaz (sz, a); printf("\n\n\nФайл считан. Нажмите любую клавишу для возврата в меню");_getch(); break;
case 3: exit(0);
default: puts ( "Неверный выбор, нажмите любую клавишу"); _getch();}
} }
} |