Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Листинг 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 записано в двух разных вариантах, чтобы вы сами могли оценить, какой из них вам более понятен (профессионалы предпочли бы второй, более ла­коничный вариант).

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





Дата публикования: 2015-10-09; Прочитано: 272 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...