簡體   English   中英

用C在二進制文件中讀取和寫入結構,然后打印結構元素

[英]Reading and writing structure to binary file in C, then print structure elements

我想將結構寫入程序A中的二進制文件,然后在程序B中從中讀取,從而將結構打印出來。 但是,我得到的輸出不正確。

我嘗試在程序A中進行fwrite,然后在程序B中進行fread,然后隨后使用printf打印輸出,只是得到了一個無意義的數字字符串。

程序A:

  #include <stdio.h>
  #include <stdlib.h>

  struct record
  {
    int index;
    char name [100];
    int age;
  };

  int main ()
  {
     struct record *one=malloc(sizeof(struct record));
     FILE *in=fopen("records.bin", "ab+")l

     fgets(one->name, 100, stdin);
     one->index=100;
     one->age=50;

     fwrite(&one, sizeof(struct record), 1, in);
     fclose(in);
  }

程序B(所有標頭和結構相同,帶有以下代碼):

  int main ()
  {

     FILE *in=fopen("records.bin", "rb+");

     struct record array;

     fread (&array, sizeof(struct record), 1, in);
     printf ("%d\n", array.index);
     printf ("%s\n", array.name);
     printf ("%d\n", array.age);

     fclose(in);

  }

我期望輸出是

100
j
50

但是實際輸出是172400800

您正在將垃圾寫入文件,因為您使用的是指針的指針 ,而不是指針。

因此,您可以進行快速修復:

fwrite(one, sizeof(struct record), 1, in);

或者您可以重寫以避免分配,這可能是一個好主意,因為在這里它完全沒有必要:

#include <stdio.h>
#include <stdlib.h>

struct record
{
  int index;
  char name [100];
  int age;
};

int main ()
{
  struct record one;

  FILE *in = fopen("records.bin", "ab+");

  fgets(one.name, 100, stdin);
  one.index=100;
  one.age=50;

  fwrite(&one, sizeof(struct record), 1, in);
  fclose(in);
}

另外需要注意的是,您實際上應該轉向具有內在含義的變量名稱。 one沒有意義。 即使有些模棱兩可, r還是一個改進,因為至少“ r”表示與“記錄”相關的內容。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM