C将struct写入文件

时间:2017-03-29 02:34:45

标签: c struct

我正在尝试将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到文件的指针? 请帮帮我们。

1 个答案:

答案 0 :(得分:1)

您的代码中有两个明显的错误。

  1. 在struct声明中,金额的类型是char,但是当你在trx_list->amount = "123123123";中初始化它时,你分配了一个字符串或char [10]数组(还有一个额外的数组)对于NULL终止符)。

  2. 在功能display_trx中,第二个printf&card_data->currency的结果为int *,而非int。如果您想打印货币,为什么不按照第一次打印,请使用card_data->currency(不带&)?您获得的数字很大,因为您打印的指针值已隐式转换为int,或者是card_data中的货币地址。

  3. 并且有一个错误,编译器不会警告你(因为它在语法上不是错误的。)。正如BLUEPIXY在评论中所说,在分配和初始化trx_list时,你应该真正使用calloc(1, sizeof(node_trx))。您为指针trx_list指向的空间分配空间,而不是指针本身,因此sizeof中不应该有星号。

    我的建议是使用" smart"编译器,如gcc,并启用警告。这是一个很好的做法(至少对我而言)。谢谢!