使用fscanf()逐行读取文件,包括空格

问题描述 投票:0回答:1

我需要使用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],但最终只能无限打印文件中的第一行。

我想知道的是使用类似于上面的语句逐行循环遍历文件的最佳方法,该语句可以读取带有空格的整个字符串,而不会破坏其他所有内容。

c scanf whitespace
1个回答
1
投票

您在这里。为简单起见,使用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
© www.soinside.com 2019 - 2024. All rights reserved.