Чтение данных из текстового файла построчно в массивы с использованием strtok в C - PullRequest
0 голосов
/ 02 марта 2019

В настоящее время пытаемся читать данные из текстового файла построчно, используя 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 Ответ

0 голосов
/ 02 марта 2019

Если мы берем первую строку файла

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 символов.Но будьте осторожны, так как дополнительный символ в одной из строк снова вызовет ту же проблему.

...