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()
сканировать int
s.