![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 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 записано в двух разных вариантах, чтобы вы сами могли оценить, какой из них вам более понятен (профессионалы предпочли бы второй, более лаконичный вариант). Структура, в отличие от массива, может быть возвращаемым значением функции. В этой программе структура передавалась в функцию по константной ссылке; можно передавать ее и по значению, что несколько хуже, потому что в этом случае затрачивается время на копирование и требуется дополнительное место в стеке параметров.
|