Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C++ Metod_new.doc
Скачиваний:
3
Добавлен:
10.11.2019
Размер:
939.52 Кб
Скачать

2. Робота зі структурами є універсальною, передбачено додавання записів до файлу (флаг ios:app). Для підрахунку кількості структур на диску приведемо наступні рядки програми:

..................................................................................................

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

..................................................................................................

Спочатку встановлюється вказівка у кінець файлу, а потім ділимо поточну позицію файлу (функція tellg()) на кількість байтів нашої структури inf_d. Таким чином отримуємо кількість структур на диску (змінна kol_st).

3. Після переведення вказівки на кінець файлу (функція eof()) виникає біт помилки ios::eofbit, що дорівнює 1. Для того щоб продовжити роботу з файлом потоку, необхідно скинути цей біт. Робиться це за допомогою функції clear(), яка скидує всі біти помилок файлового потоку.

Приведемо текст програми роботи зі структурами з використанням інформації по дискам.

//Програма роботи зі структурами

//з використанням диску

# include <iostream.h>

# include <stdio.h>

# include <stdlib.h>

# include <conio.h>

# include <fstream.h>

# include <iomanip.h>

# include <string.h>

fstream pp;

struct inf_d //Визначення структури

{

long int ob; //число оборотів

int vr; //час доступу до диску

long int kod;//код виробу

double cena; //ціна виробу

char firma[20]; //назва фірми

};

int menu(void); //Оголошення функцій: меню,

void v_dan(void); //перегляду,

void readst(int nom = 0); //читання структури

int vib_struct(void); // вибір елемента структури

// переведення символів із кодировки Windows у кодировку DOS

char* recode(char *TXT);

// перевірка символів на числа

bool IsNumeric(char *str, bool dr);

// Головна функція програми

void main ()

{

int nom_menu;

pp.open("Ot.txt",(ios::in)|(ios::out)

|(ios::app));

while(1)

{

clrscr();

nom_menu = menu();

if (nom_menu == 1) v_dan();

if (nom_menu == 2) readst();

if (nom_menu == 3) readst(vib_struct());

if (nom_menu == 4) break;

}

pp.close(); //Закриття файла

}

//**************МЕНЮ*********************

//Визначення функції меню

int menu()

{

char s[50];

int nom_menu;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

while(1)

{

nom_menu = 0;

clrscr();

gotoxy(27,4);

cout<<recode("Всего структур ")<<kol_st;

gotoxy(20,6);

cout<< "====================================";

gotoxy(20,7);

cout<<recode("| 1 - Ввод данных по дисководу |");

gotoxy(20,8);

cout<<recode("| 2 - Отображение всех данных |");

gotoxy(20,9);

cout<<recode("| 3 - Просмотр заданной структуры |");

gotoxy(20,10);

cout<<recode("| 4 - Выход |");

gotoxy(20,11);

cout<< "====================================\n";

gotoxy (27,13);

cout << recode("Введите пункт меню ");

gets(s);

if (IsNumeric(s, 0))nom_menu = atoi(s);

if ((nom_menu < 1 )||(nom_menu > 4))

{

gotoxy(18,18);

cout<< "----------------------------------------";

gotoxy(18,19);

cout<<recode("| Ошибка! Пункт меню должен быть 1 - 4 |");

gotoxy(18,20);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,21);

cout<< "----------------------------------------";

getch();

gotoxy (44,13);

cout << " ";

continue;

}

return nom_menu;

}

}

// Функція вибору номера структури

int vib_struct()

{

char s[50];

int nom_st;

long kol_st;

pp.seekg(0L,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

if(!kol_st)return 0;

while(1)

{

nom_st = 0;

clrscr();

gotoxy(1,2);

cout<<recode("Введите номер структуры -> ");

gets(s);

if(IsNumeric(s, 0))nom_st=atoi(s);

if(nom_st<1) continue;

if(nom_st<=kol_st)break;

gotoxy(18,10);

cout<< "------------------------------------------";

gotoxy(18,11);

cout<<recode("| Внимание!!! |");

gotoxy(18,12);

cout<< recode("| В файле нет")<<setw(3)<<nom_st;

cout<<recode("-й структуры |");

gotoxy(18,13);

cout<< recode("| Файл содержит только")<<setw(3)<<kol_st;

cout<<recode(" структур(ы) |");

gotoxy(18,14);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,15);

cout<< "------------------------------------------";

getch();

}

return nom_st;

}

//*****************ВВЕДЕННЯ**********************

// Визначення функції введення даних

void v_dan()

{

inf_d dis;

int i;

char s[50];

clrscr();

for(i=0;i<4;i++)

while(1)

{

gotoxy(1,2+2*i);

if(i==0)cout<<recode("Введите число оборотов диска ->");

if(i==1)cout<<recode("Введите время доступа к диску ->");

if(i==2)cout<<recode("Введите код товара ->");

if(i==3)cout<<recode("Введите цену дисковода ->");

gotoxy(35,2+2*i);

gets(s);

if(IsNumeric(s,(i==3)?1:0))

{

if(i==0)dis.ob=atoi(s);

if(i==1)dis.vr=atoi(s);

if(i==2)dis.kod=atoi(s);

if(i==3)dis.cena=atof(s);

break;

}

gotoxy(35,2+2*i);

cout<<" ";

}

gotoxy(1,10);

cout << recode("Введите название фирмы ->");

gotoxy(35,10);

gets(dis.firma);

//переведення курсору на кінець файла

pp.seekg(0L,ios::end);

pp.write((char*)&dis,sizeof(dis));//Запис на диск

}

//****************ЧИТАННЯ*********************

//Функція читання даних з диску

void readst(int nom_st)

{

inf_d od;

long kol_st, ch_b = 0;

clrscr();

pp.seekg(ch_b,ios::end);

kol_st = pp.tellg()/sizeof(inf_d);

if(!kol_st)

{

gotoxy(18,10);

cout<< "-----------------------------------------";

gotoxy(18,11);

cout<<recode("| Внимание! В файле нет информации |");

gotoxy(18,12);

cout<<recode("| Для ввода используйте пункт 1 меню |");

gotoxy(18,13);

cout<<recode("| Нажмите любую клавишу |");

gotoxy(18,14);

cout<< "-----------------------------------------";

getch();

return;

}

if(nom_st > 0)ch_b = sizeof(od)*(nom_st-1);

pp.seekg(ch_b,ios::beg);//Відкриття файла

//Читання файла з диска

cout<<recode("\n Данные по дискам:\n");

while(1)

{

pp.read((char *)&od, sizeof(od));

// Очистка біту помилки (clear()) та вихід з циклу

if(pp.eof()){pp.clear();break;}

cout<<"\n";

cout<<recode(" обороты-")<<setw(3)<<od.ob;

cout<<recode(" время-")<< setw(5)<<od.vr;

cout<<recode(" код-") << setw(3)<<od.kod;

cout<<recode(" цена-")<< setw(7)<<od.cena;

cout<<recode(" фирма- ")<< od.firma;

if(nom_st)break;

}

getch();

}

// Функція переведення кодировки із Windows у DOS

char* recode(char *TXT)

{

static char buf[257];

strcpy(buf,TXT);

for(int i=0;i<strlen(buf);i++)

{

if (buf[i]>='А'&&buf[i]<='п')buf[i]-=64;

if (buf[i]>='р'&&buf[i]<='я')buf[i]-=16;

}

return buf;

}

// Функція перевірки символів на числа

// Вхід:

// str - строка символів;

// dr = false (0) - перевірка на ціле число;

// dr = true (1) - перевірка на дробове число;

// Повертання:

// true - перевірка пройшла успішно

// false - введено не числове значення, або число не задовільняє умовам.

bool

IsNumeric(char *str, bool dr)

{

int i;

if (!strlen(str) || str[0] == '.')return false ;

for (i = 0; i < (int)strlen(str); i++ )

{

if (i == 0 && (str[0] == '+' || str[0] == '-')) continue;

if ((str[i] >= '0' && str[i] <='9') ||

str[i]=='.') continue;

return false;

}

int pos = 0;

for (i = 0; i < (int)strlen(str);i++)

if (str[i]=='.')pos++;

if ( (!dr && pos) || (pos > 1)) return false ;

return true;

}

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]