1

当前尝试使用 strtok 和空格作为分隔符逐行从文本文件中读取数据,并将信息保存到不同的数组中。我使用 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

ETC..

895
0
895
0

ETC..

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

任何帮助都是有价值的!

4

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

于 2019-03-02T20:41:19.263 回答