我需要使用fscanf逐行读取c文本文件(是的,我知道fgets()更好,但这是人为的赋值)。文件中的数据格式如下(忽略引号):
"firstname lastname"|100|500|300
"otherfirstname otherlastname"|150|450|120
etc...
每个点都将读取为fscanf(fp,“%s |%d |%d |%d \ n”,buf,&int1,&int2,&int3);
上面的工作方式,但是,该字符串仅作为第一个单词(名字)被读取,而第二个单词将被省略。我曾尝试使用[^ \ n],但最终只能无限打印文件中的第一行。
我想知道的是使用类似于上面的语句逐行循环遍历文件的最佳方法,该语句可以读取带有空格的整个字符串,而不会破坏其他所有内容。
您在这里。为简单起见,使用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, %d\n", name, x, y, z );
}
return 0;
}
程序输出为
firstname lastname, 100, 500, 300
otherfirstname otherlastname , 150, 450, 120