Пользователи Unix - C (СИ)
Формулировка задачи:
Доброго времени суток, хотел бы попросить у вас помощи или полезных советов по данной программе :
"Вывести пользователей входящих только в одну группу"
Примерно накидал программу , но пока не могу понять как вытаскивать из файла нужные строки.
Файл /etc/group выглядит так Где root - пользователь:x-пароль группы:0 - номер группы:
на выходе мне надо видеть только пользоватей которые принадлежат номеру группы,а этот номер читается из конфигурационного файла conf.txt
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<ctype.h> main(int argc,char *argv[]) { time_t clock; int i,q,w; char ch,gr,id; FILE *fin, *flog, *fout; puts("Работу выполнил Мухамедгалиев Ринат ИВТ-11"); puts("Программа выводит всех пользователей группы."); puts("Номер группы указывается в конфигурационном файле conf.txt"); gr=':'; if (argc != 2) { printf("Ошибка не был указан конфигурационный фаил.Для запуска программы используйте следующую форму:\n"); printf("./text conf.txt \n"); } if ((flog=fopen("log.txt","a"))==NULL) { puts("Ошибка открытия файла протокола log.txt"); exit(0); } clock=time(NULL); fprintf(flog,"%s:Протокол log.txt открыт успешно\n",ctime(&clock)); clock=time(NULL); if ((fin=fopen("conf.txt","r"))==NULL) { clock=time(NULL); fprintf(flog,"%s:Ошибка открытия конфигурационного файла",ctime(&clock)); printf("Ошибка открытия конфигурационного файла\n"); exit(0); } else { clock=time(NULL); fprintf(flog,"%s:конфигурационный фаил открыт успешно \n",ctime(&clock)); } if ((fout=fopen("/etc/group","r"))==NULL) { clock=time(NULL); fprintf(flog,"%s:Ошибка открытия файла /etc/group\n",ctime(&clock)); puts("Ошибка открытия файла /etc/group"); exit(0); } else { clock=time(NULL); fprintf(flog,"%s:/etc/group фаил открыт успешно\n",ctime(&clock)); } while (!feof(fin)) { id=getc(fin); if(id>65535){puts("Ошибка вывода идентефикатора группы");} } while (!feof(fout)) { ch=getc(fout); clock=time(NULL); if(ch = ':'){for (i=0;i>3;i++) } } fclose(fin); clock=time(NULL); fprintf(flog,"%s:Входной фаил закрыт\n",ctime(&clock)); fclose(fout); /*clock=time(NULL); fprintf(flog,"%s:Выходной фаил закрыт\n",ctime(&clock)); clock=time(NULL);*/ fprintf(flog,"%s:Работа завершена\n",ctime(&clock)); fclose(flog); puts("Нажмите Enter"); getchar(); exit(0); }
root:x:0: daemon:x:1: bin:x:2: sys:x:3: adm:x:4:iword tty:x:5: disk:x:6: lp:x:7: mail:x:8: news:x:9: uucp:x:10: man:x:12: proxy:x:13: kmem:x:15: dialout:x:20:iword
А как примерно можно вытаскивать номер группы из файла /etc/group в каждой строке ?
Решение задачи: «Пользователи Unix»
textual
Листинг программы
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h> #include<ctype.h> #include <ncursesw/curses.h> #include <locale.h> #include "privetstvie.h" #include "sort.h" #define MAXLINE 1000 main(int argc,char *argv[]) { setlocale(LC_ALL,""); initscr(); refresh(); FILE *fin,*flog; char line[MAXLINE]; int id; char *str1="Error file don't open log.txt "; char *str2="Error file don't open /etc/group "; char *str3="Error!!! Vvodite ./group [nomer gruppy]"; char *str4="Press Enter"; time_t clock;//Шапка программы priv(); //Блок открытия файлов if ((flog=fopen("log.txt","a"))==NULL)//Файл логирования { WINDOW *error_win; initscr(); start_color(); if (has_colors()) { init_pair(1, COLOR_RED, COLOR_BLUE);} setlocale(LC_CTYPE, ""); error_win=newwin(WHEIGHT, WWIDTH, (LINES-WHEIGHT)/2, (COLS-WWIDTH)/2); box(error_win, '*', '*'); wbkgd(error_win, COLOR_PAIR(1)|A_BOLD|A_BLINK); mvwprintw(error_win,WHEIGHT/2, (WWIDTH-strlen(str1))/2,"%s",str1); wrefresh(error_win); getch(); endwin(); } else { clock=time(NULL); fprintf(flog,"%s:Протокол log.txt открыт успешно\n",ctime(&clock)); } if ((fin=fopen("/etc/group","r"))==NULL)//Входной файл открыт { clock=time(NULL); fprintf(flog,"%s:Ошибка открытия файла /etc/group\n",ctime(&clock)); WINDOW *error_win1; initscr(); start_color(); if (has_colors()) { init_pair(1, COLOR_RED, COLOR_BLUE);} setlocale(LC_CTYPE, ""); error_win1=newwin(WHEIGHT, WWIDTH, (LINES-WHEIGHT)/2, (COLS-WWIDTH)/2); box(error_win1, '*', '*'); wbkgd(error_win1, COLOR_PAIR(1)|A_BOLD|A_BLINK); mvwprintw(error_win1,WHEIGHT/2, (WWIDTH-strlen(str2))/2,"%s",str2); wrefresh(error_win1); getch(); endwin(); } else { clock=time(NULL); fprintf(flog,"%s: Файл /etc/group открыт успешно\n",ctime(&clock)); } if (argc < 2) { WINDOW *error_win2; initscr(); start_color(); if (has_colors()) { init_pair(1, COLOR_RED, COLOR_BLUE);} setlocale(LC_CTYPE, ""); error_win2=newwin(WHEIGHT, WWIDTH, (LINES-WHEIGHT)/2, (COLS-WWIDTH)/2); box(error_win2, '*', '*'); wbkgd(error_win2, COLOR_PAIR(1)|A_BOLD|A_BLINK); mvwprintw(error_win2,WHEIGHT/2, (WWIDTH-strlen(str3))/2,"%s",str3); wrefresh(error_win2); getch(); endwin(); move(12,10);printw("\n"); fprintf(flog,"%s:Ошибка не указан номер группы.Используйте команду ./group [nomer gruppy]\n",ctime(&clock)); getchar(); exit(0); } id=atoi(argv[1]); while (fgets(line, sizeof line, fin) != NULL) func(line,id); fclose(fin); clock=time(NULL); fprintf(flog,"%s:Входной фаил закрыт\n",ctime(&clock)); fprintf(flog,"%s:Работа завершена\n",ctime(&clock)); fclose(flog); WINDOW *error_win3; initscr(); start_color(); if (has_colors()) { init_pair(1, COLOR_BLUE, COLOR_WHITE);} setlocale(LC_CTYPE, ""); error_win3=newwin(WHEIGHT, WWIDTH, (LINES-WHEIGHT)/2, (COLS-WWIDTH)/2); box(error_win3, '*', '*'); wbkgd(error_win3, COLOR_PAIR(1)|A_BOLD|A_BLINK); mvwprintw(error_win3,WHEIGHT/2, (WWIDTH-strlen(str4))/2,"%s",str4); wrefresh(error_win3); getch(); endwin(); exit(0); }
Объяснение кода листинга программы
В данном коде выполняется следующая последовательность действий:
- Устанавливается локальная переменная
setlocale(LC_ALL,``)
. - Инициализируются некоторые переменные и функции для работы с консолью и файлами, такие как
initscr()
,refresh()
,fopen()
,fprintf()
,getch()
,endwin()
. - Создаются окна для вывода сообщений об ошибках с помощью функций
newwin()
,box()
,wbkgd()
,mvwprintw()
,wrefresh()
. - Проверяется, открылись ли файлы
flog.txt
и/etc/group
успешно или нет. - Если файлы не открылись, выводится сообщение об ошибке в соответствующее окно.
- Если файлы открылись успешно, в окно вывода выводится информация о времени открытия файла.
- Проверяется, были ли переданы аргументы командной строки.
- Если аргументы не были переданы, выводится сообщение об ошибке в окно вывода.
- Если аргументы были переданы, выполняется функция
func()
, которая обрабатывает содержимое входного файла. - Файл закрывается, выводится информация о времени закрытия файла в окно вывода и в файл
flog.txt
. - Завершается работа программы.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д