Чтение данных из текстового файла построчно в массивы с использованием strtok в C
В настоящее время пытаются читать данные из текстового файла построчно, используя strtok и пробел в качестве разделителя, и сохранять информацию в разных массивах. Я использую библиотеку FatFs, чтобы прочитать файл с SD-карты. Я только пытаюсь прочитать первые 2 элемента из строки.
Мой текстовый файл выглядит так:
223 895 200 200 87 700 700 700
222 895 200 200 87 700 700 700
221 895 200 200 87 700 700 700
222 895 200 200 87 700 700 700
Мой текущий код выглядит примерно так:
void sd_card_read()
{
char buffer[30];
char buffer2[10];
char buffer3[10];
int i=0;
int k=0;
int l=0;
int16 temp_array[500];
int16 hum_array[500];
char *p;
FIL fileO;
uint8 resultF;
resultF = f_open(&fileO, "dados.txt", FA_READ);
if(resultF == FR_OK)
{
UART_UartPutString("Reading...");
UART_UartPutString("\n\r");
while(f_gets(buffer, sizeof(buffer), &fileO))
{
p = strtok(buffer, " ");
temp_array[i] = atoi(p);
UART_UartPutString(p);
UART_UartPutString("\r\n");
p = strtok(NULL, " ");
hum_array[i] = atoi(p);
UART_UartPutString(p);
UART_UartPutString("\r\n");
i++;
}
UART_UartPutString("Done reading");
resultF = f_close(&fileO);
}
UART_UartPutString("Printing");
UART_UartPutString("\r\n");
for (k = 0; k < 10; k++)
{
itoa(temp_array[k], buffer2, 10);
UART_UartPutString(buffer2);
UART_UartPutString("\r\n");
}
for (l = 0; l < 10; l++)
{
itoa(hum_array[l], buffer3, 10);
UART_UartPutString(buffer3);
UART_UartPutString("\r\n");
}
}
Выходной атм это:
223
0
222
0
так далее..
895
0
895
0
так далее..
Прочитав один раз, он помещает следующую позицию в 0 в обоих массивах, что не то, что нужно. Это, вероятно, что-то основное, но не могу понять, что не так.
Любая помощь ценна!
1 ответ
Если мы возьмем первую строку файла
223 895 200 200 87 700 700 700
Это строки, включая пробел и перевод строки (при условии, что один '\n'
) 31 символов в длину. И так как строки в C должны быть завершены '\0'
строка требует не менее 32 символов (если f_gets
работает аналогично стандарту fgets
и добавляет новую строку).
Ваш буфер, в который вы читаете, вмещает только 30 символов, что означает, что будут прочитаны только 29 символов вашей строки, а затем добавлен терминатор. Так что это означает, что вы только читаете
223 895 200 200 87 700 700 70
В следующий раз, когда вы позвоните f_gets
функция будет читать оставшиеся
0
Вам нужно увеличить размер буфера, чтобы можно было уместить все строки. С текущими данными это должно быть не менее 32 символов. Но будьте осторожны, так как дополнительный символ в одной из строк снова вызовет ту же проблему.