Посимвольное чтение строки из файла с нюансами - C (СИ)
Формулировка задачи:
Доброго времени суток.
Есть файл, состоящий из нескольких строк.
Каждая строка записана по шаблону:
Это файл /etc/group в linux, да.
Как реализовать то, что указано в комментарии?
Буду рад любой помощи и подсказкам!
group_name:password:group_id:list
#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;
}