Linux программирование в примерах
Шрифт:
40
41 int main(int argc, char **argv)
42 {
43 #define NPRES 10
44 struct employee presidents[NPRES];
45 int i, npres;
46 char buf[BUFSIZ];
47 struct employee *the_pres;
48 struct employee key;
49 int id;
50 FILE *fp;
51
52 if (argc != 2) {
53 fprintf(stderr, "usage: %s datafile\n", argv[0]);
54 exit(1);
55 }
56
57 if ((fp = fopen(argv[1], "r")) == NULL) {
58 fprintf(stderr, "%s: %s: could not open: %s\n", argv[0],
59 argv[1], strerror(errno));
60 exit(1);
61 }
62
63 /*
Очень простой код для чтения данных: */
64 for (npres = 0; npres < NPRES && fgets(buf, BUFSIZ, fp) != NULL;
65 npres++) {
66 sscanf(buf, "%s %s %ld %ld",
67 presidents[npres].lastname,
68 presidents[npres].firstname,
69 &presidents[npres].emp_id,
70 &presidents[npres].start_date);
71 }
72 fclose(fp);
73
74 /* В npres теперь число действительно прочитанных строк. */
75
76 /* Сначала отсортировать по id */
77 qsort(presidents, npres, sizeof(struct employee), emp_id_compare);
78
79 /* Напечатать результат */
80 printf("Sorted by ID:\n");
81 for (i = 0; i < npres; i++) {
82 putchar('\t');
83 print_employee(&presidents[i]);
84 }
85
86 for (;;) {
87 printf("Enter ID number: ");
88 if (fgets(buf, BUFSIZ, stdin) == NULL)
89 break;
90
91 sscanf(buf, "%d\n", &id);
92 key.emp_id = id;
93 the_pres = (struct employee*)bsearch(&key, presidents,
94 npres, sizeof(struct employee), emp_id_compare);
95
96 if (the_pres != NULL) {
97 printf("Found: ");
98 print_employee(the_pres);
99 } else
100 printf("Employee with ID %d not found'\n", id);
101 }
102
103 putchar('\n'); /*
Напечатать в конце символ новой строки. */
104
105 exit(0);
106 }
Функция
main
начинается с проверки аргументов (строки 52–55). Затем она читает данные из указанного файла (строки 57–72). Стандартный ввод для данных сотрудников использоваться не может, поскольку он зарезервирован для запроса у пользователя ID искомого сотрудника. Строки 77–84 сортируют, а затем печатают данные. Затем программа входит в цикл, начинающийся со строки 86. Она запрашивает идентификационный номер сотрудника, выходя из цикла по достижению конца файла. Для поиска в массиве мы используем
struct employee
с именем key
. Достаточно лишь установить в его поле emp_id введенный номер ID; другие поля при сравнении не используются (строка 92). Если найден элемент с подходящим ключом,
bsearch
возвращает указатель на него. В противном случае она возвращает NULL
. Возвращенное значение проверяется в строке 96, и осуществляется нужное действие. Наконец, строка 102 выводит символ конца строки, чтобы системное приглашение появилось с новой строки. Вот что появляется после компилирования и запуска программы:
$ ch06-searchemp presdata.txt /* Запуск программы */
Sorted by ID:
Carter James 39 Thu Jan 20 13:00:00 1977
Reagan Ronald 40 Tue Jan 20 13:00:00 1981
Bush George 41 Fri Jan 20 13:00:00 1989
Clinton William 42 Wed Jan 20 13:00:00 1993
Bush George 43 Sat Jan 20 13:00:00 2001
Enter ID number: 42 /* Ввод действительного номера */
Found: Clinton William 42 Wed Jan 20 13:00:00 1993 /* Найдено */
Enter ID number: 29 /* Ввод неверного номера */
Employee with ID 29 not found! /* He найдено */
Enter ID number: 40 /* Попытка другого верного номера */
Found: Reagan Ronald 40 Tue Jan 20 13:00:00 1981 /* Этот тоже найден */
Enter ID number: ^D /* CTRL-D в качестве конца файла */
$ /* Готов к приему следующей команды */
Поделиться:
Популярные книги
Мастер 7
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Зауряд-врач
1. Зауряд-врач
Фантастика:
альтернативная история
8.64
рейтинг книги
Эйгор. В потёмках
1. Эйгор
Фантастика:
боевая фантастика
7.00
рейтинг книги
Неудержимый. Книга II
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Невеста на откуп
2. Невеста на откуп
Фантастика:
фэнтези
5.83
рейтинг книги
Граф
6. Помещик
Фантастика:
альтернативная история
5.00
рейтинг книги
Кодекс Охотника. Книга XVII
17. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Все еще не Герой!. Том 2
2. Путешествие Героя
Фантастика:
боевая фантастика
юмористическое фэнтези
городское фэнтези
рпг
5.00
рейтинг книги
Восьмое правило дворянина
8. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
70 Рублей
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
Газлайтер. Том 9
9. История Телепата
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кровь Василиска
1. Кровь Василиска
Фантастика:
фэнтези
попаданцы
аниме
4.25
рейтинг книги
Штурм Земли
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Камень. Книга пятая
5. Камень
Фантастика:
боевая фантастика
6.43