這看起來像scanf()可以使用的那些比較罕見的場合之一。
你可以嘗試:
while (fscanf(fp, "%[^=]=%[^;]", 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[^;]", 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);
}
你仍然要閱讀完整的線,然後記號化它。它聽起來像OP不想首先閱讀完整的文本行。 – dice 2009-11-14 21:28:59
我正在摔跤。既然你已經提供了滿足這個標準的答案,我們的OP有兩個不同的觀點要考慮,這取決於避免緩存整條線的重要性。 – 2009-11-14 21:32:08