现在我使用:
char record[BUFLEN];
if (fgets(record, BUFLEN, fp) != NULL) {
/* some code */
}
从输入中获取行:
city=Boston;name=Bob;age=35
city=New York;name=Michael;age=29
我可以在C中使用其他东西,直到'\ n'才能给我整行,但是单独的对象如:“city = Boston”然后“name = Bob”等等?
答案 0 :(得分:3)
这看起来像是可以使用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);
}
答案 1 :(得分:2)
你可以使用fgetc一次读取一个字节。
读取直到=成一个阵列然后直到;在另一个
do {
c = fgetc (pFile);
if (c == ';')
// etc
} while (c != EOF);
答案 2 :(得分:1)
查看strtok()功能。连续调用将从字符串中检索每个标记。
使用您的示例:
char record[BUFLEN];
if(fgets(record, BUFLEN, fp) != NULL) {
char *token;
token = strtok( record, ";" );
while ( token != NULL )
{
doSomethingWith( token );
token = strtok( NULL, ";" );
}
}
答案 3 :(得分:0)
你可能会复制fgets()的功能,只能通过你指定的分隔符“fget”,而不是\ n。代码看起来像(这是PSEUDOCODE):
在此功能中,“DELIM”是您要使用的分隔符。而不是\n
,它可能是;
。
char *GOEfgets(char *buf, int BUFLEN, FILE *fp, char DELIM)
{
int i = 0; /* counter */
int character;
while(character = fgetc(fp)) /* we get a char from the stream one at a time */
{
buf[i] = (char)character; /* store that character in the stream */
if ((char)character == DELIM) /* if we run into our delimiter, we stop */
{
return buf;
}
}
}