【问题标题】:Reading data from a text file line by line into arrays using strtok in C使用C中的strtok将文本文件中的数据逐行读取到数组中
【发布时间】:2019-07-24 13:11:17
【问题描述】:

当前尝试使用 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

等等。

895
0
895
0

等等。

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

任何帮助都是有价值的!

【问题讨论】:

  • 如果计算一行中的字符数(包括空格、换行符字符串终止符),你会得到多少?它是否适合您的 buffer 30 个字符的数组?
  • @Someprogrammerdude 看起来我睡眠不足或需要更多咖啡。谢谢你的回答,确实是这个问题。也许我应该删除这篇文章?
  • 不,我可以尝试写一个正确的答案。

标签: c microcontroller fatfs


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

【讨论】:

    猜你喜欢
    • 2014-04-22
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多