当前尝试使用strtok和空格作为分隔符逐行从文本文件中读取数据,并将信息保存到不同的数组中。我正在使用FatFs库从SD卡读取文件。自动取款机只尝试读取该行的前两个元素。
我的文本文件如下:
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,这不是想要的。它可能是一些基本的东西,但看不到出什么问题了。
任何帮助都是有价值的!
答案 0 :(得分:2)
如果我们采用文件的第一行
223 895 200 200 87 700 700 700
该行包括空格和换行符(假设单个postCustomer
)长31个字符。并且由于C中的字符串需要以'\n'
结尾,所以该行至少需要32个字符(如果'\0'
的工作方式类似于标准的f_gets
函数,并添加换行符)。
您读入的缓冲区只能容纳30个字符,这意味着将仅读取行的29个字符,然后添加终止符。因此,这意味着您只能阅读
223 895 200 200 87 700 700 70
下次调用fgets
时,该函数将读取其余的
0
您需要增加缓冲区的大小以适合所有行。对于当前数据,它必须至少为32个字符。但是要小心,因为其中一行中的多余字符会再次给您带来同样的问题。