我需要使用 fscanf 逐行读取 c 格式的文本文件(是的,我知道,fgets(( 更适合这个,但这是一个人为的任务(。 文件中的数据格式如下(忽略引号(:
"firstname lastname"|100|500|300
"otherfirstname otherlastname"|150|450|120
etc...
每个点将读作 fscanf(fp, "%s|%d|%d|%d", buf, &int1, &int2, &int3(;
上述方法有效,但是,字符串将仅读取为第一个单词(名字(,而第二个单词将被省略。我尝试使用 [^],但我最终只是无限打印文件中的第一行。
我想知道的是使用类似于上述的语句逐行循环文件的最佳方法,该方法可以读取带有空格的整个字符串而不会破坏其他所有内容。
你来了。为简单起见,使用sscanf
而不是fscanf
。
#include <stdio.h>
int main(void)
{
const char *buf = "firstname lastname|100|500|300 n"
"otherfirstname otherlastname |150|450|120 n";
char name[100];
int x, y, z;
int offset = 0;
while ( sscanf( buf, "%[^|] | %d | %d | %d%n", name, &x, &y, &z, &offset ) == 4 )
{
buf += offset;
sscanf( buf, "%*[^n]%n", &offset );
buf += offset;
sscanf( buf, "%*c%n", &offset );
buf += offset;
printf( "%s, %d, %d, %dn", name, x, y, z );
}
return 0;
}
程序输出为
firstname lastname, 100, 500, 300
otherfirstname otherlastname , 150, 450, 120