Чтение онлайн

на главную - закладки

Жанры

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 в качестве конца файла */

$ /* Готов к приему следующей команды */

Поделиться:
Популярные книги

Эволюционер из трущоб. Том 12

Панарин Антон
12. Эволюционер из трущоб
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эволюционер из трущоб. Том 12

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Вперед в прошлое 7

Ратманов Денис
7. Вперед в прошлое
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Вперед в прошлое 7

На границе империй. Том 10. Часть 13

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 10. Часть 13

Герой

Мазин Александр Владимирович
4. Варяг
Фантастика:
альтернативная история
9.10
рейтинг книги
Герой

Древесный маг Орловского княжества 2

Павлов Игорь Васильевич
2. Орловское княжество
Фантастика:
аниме
сказочная фантастика
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 2

Тринадцатый X

NikL
10. Видящий смерть
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Тринадцатый X

Бояръ-Аниме. Газлайтер. Том 34

Володин Григорий Григорьевич
34. История Телепата
Фантастика:
фэнтези
боевая фантастика
аниме
5.00
рейтинг книги
Бояръ-Аниме. Газлайтер. Том 34

Виктор Глухов агент Ада. Компиляция. Книги 1-15

Сухинин Владимир Александрович
Виктор Глухов агент Ада
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
попаданцы
5.00
рейтинг книги
Виктор Глухов агент Ада. Компиляция. Книги 1-15

Династия. Феникс

Майерс Александр
5. Династия
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Династия. Феникс

Личный аптекарь императора. Том 4

Карелин Сергей Витальевич
4. Личный аптекарь императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Личный аптекарь императора. Том 4

Великий князь

Кулаков Алексей Иванович
2. Рюрикова кровь
Фантастика:
альтернативная история
8.47
рейтинг книги
Великий князь

Неучтенный элемент. Том 9

NikL
9. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 9