Посимвольное чтение строки из файла с нюансами - C (СИ)

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

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

Доброго времени суток. Есть файл, состоящий из нескольких строк. Каждая строка записана по шаблону:
group_name:password:group_id:list
Это файл /etc/group в linux, да. Как реализовать то, что указано в комментарии?
#include <stdio.h>
#include <string.h>
 
int main(int argc, char* argv[]) {
   FILE *file;
   char *fname = "/etc/group";
   char sting[100];
 
   file = fopen(fname,"r");
 
   if(file == 0)
   {
      printf("Не хватет прав для открытия '%s'",fname);
      return 0;
   }
   
   int i=0;
   char *name[100];
 
   /*
   Читаем строку из файла
   Читаем строку по символам
   Как только встретилось 3-е "двоеточие",
     считаем слова, идущие через "запятую", записываем их в переменную NAME и увеличиваем счетчик на 1 
     (т.е. как встретили "запятую", записали то, что было после 3-го "двоеточия" и до "запятой", увел. счетчик)
   Выводим NAME и счетчик
 
   пример:
   в файле много строк и есть одна такая "users::20:root,user1,user2". 
   должно вывести "имя группы:users, число пользователей - 3"
   */
 
   fclose(file);
 
return 0;
}
Буду рад любой помощи и подсказкам!

Решение задачи: «Посимвольное чтение строки из файла с нюансами»

textual
Листинг программы
#include<stdio.h>
#include<conio.h>
#include<alloc.h>
 
main()
{
 FILE *list;
 
 //структуры
 struct g {char *name; int size; struct u *users;} *group;
 struct u {char *user;} *users;
 
 //размеры
 int n=10;       //групп
 int m=10;       //юзеров
 int l=10;       //длина имени и названия
 
 //выделяю память
 group=(g *)calloc(n,sizeof(g));
 for(int i=0;i<n;i++)
 {
  group[i].name=(char *)calloc(l,sizeof(char));
  group[i].users=(u *)calloc(m,sizeof(u));
  for(int j=0;j<m;j++) group[i].users[j].user=(char *)calloc(l,sizeof(char));
 }
 
 //открываю и читаю файл file.txt
 list=fopen("file.txt","r");
 char symb;
 int dv=0;
 int sl,sm,sn,save;
 sl=sm=sn=0;
 
 while(1)
 {
  symb=fgetc(list);
  if(feof(list)!=0) break;
  if(symb!='\n')
  {
   if(symb==',') {sl=0; sm++;}
   if(symb==':') {dv++; sl=0;}
   if(dv==0) {group[sn].name[sl]=symb; sl++;}
   if(dv==3) {
              if(symb=='.') {group[sn].size=sm; dv=0; sn++; sl=0; sm=0;}
              if(symb!=',' && symb!='.' && symb!=':') {group[sn].users[sm].user[sl]=symb; sl++;}
             }
  }
 }
 
 fclose(list);
 
 for(i=0;i<sn;i++)
 {
  printf("Группа: %s\n",group[i].name);
  printf("Число пользователей: %d\n",group[i].size+1);
  printf("Пользователи:\n");
  for(int j=0;j<group[i].size+1;j++) printf("%s\n",group[i].users[j].user);
  printf("\n");
 }
 
 getch();
 
 return 0;
}

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


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

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

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