我正在尝试将struct数据保存到文件中。我以这种方式保存了数据。
node_trx * trx_list;
trx_list = calloc(1, sizeof(node_trx *));
trx_list->amount = "123123123";
trx_list->currency = 123;
trx_list->next_node = NULL;
if (1 != fwrite(trx_list, length, 1, f)) {
//error
}
free(trx_list);
这是我的结构:
typedef struct {
char amount;
int currency;
struct node_trx * next_node; } node_trx;
主要问题是在我将struct保存到文件后然后在读取后,当打印值时,它打印错误的值。例如:我将货币存储为123,然后打印6788576这种数字。
这是我的阅读代码:
int read_last_trx_from_file (const char * file_name, node_trx * * trx, unsigned * trx_len)
{
FILE * f;
*trx = NULL;
if (NULL == (f = fopen(tools_get_full_filename_const(file_name), "rb")))
{
return 2; //error
}
size_t fsize;
fseek(f, 0, SEEK_END);
fsize = ftell(f);
fprintf(stdout, "file size: %zd\n", fsize);
if (!fsize)
{
fclose(f);
return 3; //no data
} else {
if (fsize == 1) {
return 3; // no data
}
}
rewind(f);
if (NULL != (*trx = (node_trx *) calloc(1, fsize)))
{
if (1 != fread(*trx, fsize, 1, f))
{
fclose(f);
free(*trx);
return 2; //error
}
}
fclose(f);
*trx_len = fsize;
return 0; //OK }
调用读取功能的主要功能:
int display_trx() {
node_trx * card_data;
if (3 != read_last_trx_from_file(LAST_TRX_OBJECT, &card_data, &data_set_len)) {
if (card_data != NULL) {
printf("%s AMOUNT \n", card_data->amount);
printf("%d CURRENCY \n", &card_data->currency);
}
}
}
以这种方式读取后,当我打印量数据时,会发生分段错误。为什么会发生段错误? 当我打印货币时,它打印734364636这个数字。那么为什么它打印错误的数字。 或者我只写了struct到文件的指针? 请帮帮我们。
答案 0 :(得分:1)
您的代码中有两个明显的错误。
在struct声明中,金额的类型是char
,但是当你在trx_list->amount = "123123123";
中初始化它时,你分配了一个字符串或char [10]数组(还有一个额外的数组)对于NULL终止符)。
在功能display_trx
中,第二个printf
,&card_data->currency
的结果为int *
,而非int
。如果您想打印货币,为什么不按照第一次打印,请使用card_data->currency
(不带&)?您获得的数字很大,因为您打印的指针值已隐式转换为int
,或者是card_data中的货币地址。
并且有一个错误,编译器不会警告你(因为它在语法上不是错误的。)。正如BLUEPIXY在评论中所说,在分配和初始化trx_list时,你应该真正使用calloc(1, sizeof(node_trx))
。您为指针trx_list
指向的空间分配空间,而不是指针本身,因此sizeof
中不应该有星号。
我的建议是使用" smart"编译器,如gcc,并启用警告。这是一个很好的做法(至少对我而言)。谢谢!