我在读取包含长度指示符和以“|”分隔的字段的记录的文件时遇到问题。在这个程序中,我正在阅读有关产品的数量和价格的信息并对它们进行总结。但是,当我尝试使用
realloc()
作为缓冲区变量时,我遇到了意外的行为。奇怪的是,我期望的结果是 118.239998,但是当我使用 realloc()
时,结果变成了 118.275002。令人惊讶的是,当我使用 free(buffer)
然后使用 malloc()
再次为缓冲区分配内存时,我得到了正确的结果。
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
char *buffer, *produto;
int tamRegistro, quantidade;
float preco, total = 0;
FILE* arquivo;
arquivo = fopen("compras.txt", "r");
if (arquivo == NULL) {
printf("Erro ao abrir o arquivo\n");
system("pause");
exit(1);
}
//take the first length indicator
tamRegistro =fgetc(arquivo);
buffer = (char*)malloc(sizeof(char) * tamRegistro);
if (buffer == NULL) {
printf("Falha ao alocar memoria\n");
exit(1);
}
while (fread(buffer, tamRegistro, 1, arquivo) == 1) {
//separate fields
printf("LENGTH:%d-", tamRegistro);
produto = strtok(buffer, "|");
printf("%s-", produto);
quantidade = atoi(strtok(NULL, "|"));
printf("%d-", quantidade);
preco = atof(strtok(NULL, "|"));
printf("%f-\n", preco);
total += (preco * quantidade);
//take next length indicator
tamRegistro = fgetc(arquivo);
free(buffer);
buffer = (char*)malloc(sizeof(char) * tamRegistro);
//*buffer=(char*)realloc(buffer,sizeof(char)*(tamRegistro));
}
//if realloc worked * would not be commented and next line would be used
//free(buffer)
fclose(arquivo);
printf("%f\n",total);
return 0;
}
您使用
strtok
来分解缓冲区,但只要它不以 空字符 结尾,就不包含 字符串;所以你必须再分配一个字节并将 NUL 存储在那里。