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

问题描述 投票:1回答:1

目前尝试使用strtok和空格作为分隔符逐行读取文本文件中的数据,并将信息保存到不同的数组中。我使用FatFs库从SD卡读取文件。 Atm我只试图读取该行的前两个元素。

我的文本文件如下所示:

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

等等..

读取一次后,它将下一个位置的值放在两个数组中,这不是想要的。它可能是基本但不能看出什么是错的。

任何帮助都很有价值!

c microcontroller fatfs
1个回答
2
投票

如果我们采取文件的第一行

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个字符。但要小心,因为其中一行中的额外字符会再次给你同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.