在 C 中使用 strtok 将文本文件中的数据逐行读取到数组中

Reading data from a text file line by line into arrays using strtok in C

目前正在尝试使用 strtok 和 space 作为分隔符逐行从文本文件中读取数据,并将信息保存到不同的数组中。我正在使用 FatFs 库从 SD 卡读取文件。 Atm 我只试图从该行读取前 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");
}

}

输出atm是这样的:

223
0
222
0

等..

895
0
895
0

等..

读取一次后,它会将两个数组中的值 0 放入下一个位置,这不是我们想要的。它可能是一些基本的东西,但看不出有什么问题。

任何帮助都是有价值的!

如果我们取文件的第一行

223 895 200 200 87 700 700 700

那一行是,包括space和换行符(假设是单行'\n')31个字符长。由于 C 中的字符串需要由 '[=11=]' 终止,因此该行至少需要 32 个字符(如果 f_gets 与标准 fgets 函数类似,并添加换行符)。

您读入的缓冲区只能容纳 30 个字符,这意味着您的行中只会读取 29 个字符,然后添加终止符。所以这意味着你只阅读

223 895 200 200 87 700 700 70

下次调用 f_gets 函数将读取剩余的

0

您需要增加缓冲区的大小才能容纳所有行。对于当前数据,它至少需要 32 个字符。但是要小心,因为其中一行中的额外字符会再次给您带来同样的问题。