Sscanf читает строку дважды?

Все, что я хочу сделать, - это читать числа из текстового файла, что-то делать с ними и двигаться дальше.

Текстовый файл отформатирован так:

0,0,16
0,3,17
0,4,10
...etc.

Вот мой код, чтобы просто напечатать текстовый файл:

#include <stdio.h>
#include <stdlib.h>
FILE *fp;    

main()
{
        char line[10];
        int row,column,data;
        fp = fopen("data.txt","rt");
        while(fgets(line, 10, fp) != NULL)
        {
            sscanf(line,"%d,%d,%d\n",&row,&column,&data);
            printf("[Row: %d Column: %d Data %d]\n", row, column, data);
        }
        fclose (fp);
}

Всякий раз, когда я запускаю это, он выводит каждую строку дважды, так что говорит

[Row: 0 Column: 0 Data 16]
[Row: 0 Column: 0 Data 16]
...

вместо

[Row: 0 Column: 0 Data 16]
...

Я очень смущен тем, почему он делает это...

2 ответа

Решение

Если у вас есть пустые строки после каждой записи в вашем data.txt затем проверьте, если line[0] является '\n'?

Проверьте, работает ли этот код для вас:

#include <stdio.h>
#include <stdlib.h>
FILE *fp;    

int main()
{
        char line[10];
        int row,column,data;
        fp = fopen("data.txt","rt");
        while(fgets(line, 10, fp) != NULL)
        {
            if(line[0] == '\n')
                continue;
            sscanf(line,"%d,%d,%d\n",&row,&column,&data);
            printf("[Row: %d Column: %d Data %d]\n", row, column, data);
        }
        fclose (fp);
        return 0;
}

Входной файлdata.txt:

0,0,16

0,3,17

0,4,10
1,2,3

Выход:

[Row: 0 Column: 0 Data 16]
[Row: 0 Column: 3 Data 17]
[Row: 0 Column: 4 Data 10]
[Row: 1 Column: 2 Data 3]

После принять ответ

Суть проблем с неожиданными пустыми строками - это всего лишь одна потенциальная проблема чтения файла ввода. Вместо того, чтобы решать проблемы один за другим, используйте более надежную обработку ошибок.

Успешное использование "%n" в формате записывается смещение сканирования и предоставляется дополнительная информация для оценки правильности линии.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    FILE *fp;    
    char line[10];
    int row,column,data;
    fp = fopen("data.txt","rt");
    while(fgets(line, sizeof line, fp) != NULL)
    {
        int n1, n2;
        int cnt = sscanf(line," %n%d ,%d ,%d %n", 
            &n1, &row, &column, &data, &n2);
        if (n1 > 0 && line[n1] == '\0') 
          Handle_Line_Is_Entirely_Whitespace();
        else if (cnt != 3 || line[n2]) 
          Handle_IncorrectlyFormattedLine();
        else 
          printf("[Row: %d Column: %d Data %d]\n", row, column, data);
    }
    fclose (fp);
    return 0;  
}

Еще более надежный метод будет использовать strtol() сканировать ints.

Другие вопросы по тегам