Это выглядит как один из тех относительно редких случаев, когда можно использовать scanf ().
Вы можете попробовать:
while (fscanf(fp, "%[^=]=%[^;\n]", name, value) == 2)
{
if ((c = fgetc(fp)) == EOF)
break;
else if (c == ';')
...continue with same line...
else if (c == '\n')
...wrap up current line...
else
...congratulations - format error of some sort...
}
В качестве альтернативы, продолжайте использовать 'fgets ()', но используйте 'sscanf ()' в цикле, подобном этому.
Рабочий демонстрационный код:
#include <stdio.h>
int main(void)
{
char name[20];
char value[20];
while (fscanf(stdin, "%19[^=]=%19[^;\n]", name, value) == 2)
{
int c;
if ((c = fgetc(stdin)) == EOF)
break;
else if (c == ';')
printf("name = [%s]; value = [%s]\n", name, value);
else if (c == '\n')
printf("name = [%s]; value = [%s]\n", name, value);
else
fprintf(stderr, "Ooops!\n");
}
return(0);
}