Пользователи Unix - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток, хотел бы попросить у вас помощи или полезных советов по данной программе : "Вывести пользователей входящих только в одну группу" Примерно накидал программу , но пока не могу понять как вытаскивать из файла нужные строки.
#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);
}
Файл /etc/group выглядит так
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
Где root - пользователь:x-пароль группы:0 - номер группы: на выходе мне надо видеть только пользоватей которые принадлежат номеру группы,а этот номер читается из конфигурационного файла conf.txt
А как примерно можно вытаскивать номер группы из файла /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);
}

Объяснение кода листинга программы

В данном коде выполняется следующая последовательность действий:

  1. Устанавливается локальная переменная setlocale(LC_ALL,``).
  2. Инициализируются некоторые переменные и функции для работы с консолью и файлами, такие как initscr(), refresh(), fopen(), fprintf(), getch(), endwin().
  3. Создаются окна для вывода сообщений об ошибках с помощью функций newwin(), box(), wbkgd(), mvwprintw(), wrefresh().
  4. Проверяется, открылись ли файлы flog.txt и /etc/group успешно или нет.
  5. Если файлы не открылись, выводится сообщение об ошибке в соответствующее окно.
  6. Если файлы открылись успешно, в окно вывода выводится информация о времени открытия файла.
  7. Проверяется, были ли переданы аргументы командной строки.
  8. Если аргументы не были переданы, выводится сообщение об ошибке в окно вывода.
  9. Если аргументы были переданы, выполняется функция func(), которая обрабатывает содержимое входного файла.
  10. Файл закрывается, выводится информация о времени закрытия файла в окно вывода и в файл flog.txt.
  11. Завершается работа программы.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.083 из 5
Похожие ответы