Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Листинг 7.6






 

#include < stdio.h>

#include < string.h>

#include < stdlib.h> //#include < windows.h>

 

const int l name = 30;

char name[l_name + 1];

int birth year;

float pay;

 

Man read data();

int append2binfilet (const Man & man, const char* filename);

int print from bin(const char * filename);

 

int main()

{

bool contin;

char y n[2];

char filename[] = " dbase.bin";

do

{

contin = false;

if (append2binfile(read data(), filename)! = 0)

{

puts(" Ошибка при записи в файл ");

return 0;

}

puts(" Продолжить (у/n)? ”);

gets(y i);

if ((y n[0] == 'у')||(у n[0] == 'Y'))contin = true;

}

while (contin); print from bin(fi1ename);

return 0;

}

int append2binfile(const Man & man, const char* filename)

{

FILE *fout;

if ((fout-fopen(filename, " ab"))NULL) return 1;

 

int success = fwrite(& man, sizeof(man), 1, fout), fclose(fout);

if (success == 1) return 0;

else return 2;

}

 

int print from_bin(const char * filename)

{

int num; Man man; FILE *f;

if ((f = fopenCfilename, " rb")) == NULL) return 1;

fseef((f. 0. SEEKEND);

int n record - ftell(f) / sizeof (man);

while (true)

{

puts(" Введите номер записи или -1; ");

scanf(" & i", & num);

if (num < 0 || num > = n record) break;

fseek(f. num * sizeof(man). SEEK SET);

fread(& man, sizeof(man), 1, f);

// CharToOem(man, name, man, name);

printf(" %30s%5i%10, 2f\n, man.name, man.birth year. man.pay);

return 0;

}

 

Man read_data()

{

Man man;

char buf[80];

char name[l_name + 1];

puts(" Введите фамилию И.О. ");

gets(name);

if (strlen(name) < 1_name)

for (int i = strlen(name); i < l name; i++)

name[l_name] = 0;

// OemToChar(name. name);

strncpy(man.name. name. l_ name + 1);

do

{

puts(" Введите год рождения “);

gets(buf)

while ((man.birth_year = atoi(buf)) ==0);

do

{

puts(“Bвeдитe оклад ");

gets(buf);

}

while (! (man.pay =atof(buf)));

return man;

}

}

}

 

В функции ввода read data предусмотрено заполнение пробелами оставшейся час­ти строковой переменной паше, чтобы формат имени был идентичен формату вво­да в текстовом файле.

Следует обратить внимание на то, как в этой функции выполняется проверка правильно­сти ввода числовой информации. Чтение выполняется в буферную строку, кото­рая затем преобразуется с помощью функций atoi () и atof () в числа. Если функ­ции возвращают 0, преобразование выполнить не удалось (например, вместо цифр были введены буквы), и информация запрашивается повторно. Условие повторе­ния циклов 3 и 4 записано в двух разных вариантах, чтобы вы сами могли оценить, какой из них вам более понятен (профессионалы предпочли бы второй, более ла­коничный вариант).

Структура, в отличие от массива, может быть возвращаемым значени­ем функции. В этой программе структура передавалась в функцию по констант­ной ссылке; можно передавать ее и по значению, что несколько хуже, потому что в этом случае затрачивается время на копирование и требуется дополнительное ме­сто в стеке параметров.






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.