Использование fscanf () для чтения файла строка за строкой, включая пробелы - PullRequest
0 голосов
/ 06 февраля 2020

Мне нужно читать текстовый файл в c построчно, используя fscanf (да, я знаю, fgets () лучше для этого, но это надуманное назначение). Данные в файле отформатированы следующим образом (без кавычек):

"firstname lastname"|100|500|300                                    
"otherfirstname otherlastname"|150|450|120
etc...

каждая точка будет читаться как, fscanf (fp, "% s |% d |% d |% d \ n", buf, & int1, & int2, & int3);

Способ, описанный выше, работает, однако строка будет считываться только как первое слово (имя), а второе слово будет пропущено. Я пытался использовать [^ \ n], но в итоге я просто бесконечно печатал первую строку в файле.

То, что я хочу знать, - это лучший способ l oop через файл строка за строкой, используя оператор, подобный приведенному выше, который может читать целые строки с пробелами, не разрушая все остальное.

1 Ответ

1 голос
/ 06 февраля 2020

Вот, пожалуйста. Для простоты вместо fscanf используется sscanf.

#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
...