如何将输入写入二进制文件并在c中读取?

如何将输入写入二进制文件并在c中读取?,c,file,binary,bin,C,File,Binary,Bin,最近我正在做一个初学者项目。但我被困了好几天,不知道如何更新文件。然后我发现我可以使用二进制文件,所以我开始使用二进制文件而不是普通文件。但现在,当我写入二进制文件时,它可以工作(我假设),但当我从中读取时,它会给我分段错误(内核转储) 这是我的结构 struct date{ // structure for dates int mm, dd, yyyy; }; struct { char *initials, *name, *email, *acc_type; // un

最近我正在做一个初学者项目。但我被困了好几天,不知道如何更新文件。然后我发现我可以使用二进制文件,所以我开始使用二进制文件而不是普通文件。但现在,当我写入二进制文件时,它可以工作(我假设),但当我从中读取时,它会给我
分段错误(内核转储)

这是我的结构

struct date{  // structure for dates
    int mm, dd, yyyy;
};

struct {
    char *initials, *name, *email, *acc_type;  // unchangeable values 
    char id_num[11], occupation[25], address[100];  // changeable values
    int phone, acc_num, balance;
    struct date birth_day;  // structure for birth day
} new_acc;
这是我的写作功能

void新建(void)
{
//为结构中的每个成员分配内存
新会计科目名称=(char*)malloc(sizeof(新会计科目名称));
新附件首字母=(char*)malloc(sizeof(新附件首字母));
新附件电子邮件=(char*)malloc(sizeof(新附件电子邮件));
新附件附件类型=(char*)malloc(sizeof(新附件类型));
系统(“清除”);
提出(“回答问题以进行说明”);
生成一个数字的时间
srand((unsigned)time(&l));//为帐号生成一个随机数
new_acc.acc_num=l;//将l值赋给结构中的acc_num var
printf(“输入您的全名:”);
scanf(“%100[^\n]”,new_acc.name);//扫描名称、100个字符以及接受空格
printf(“输入姓名首字母:”);
scanf(“%100[^\n]”,新的首字母缩写);
printf(“输入您的生日(mm/dd/yyyy):”;
scanf(“%d%d%d”、&new\u acc.borior\u day.mm、&new\u acc.borior\u day.dd、&new\u acc.borior\u day.yyyyy)
printf(“输入您的地址:”);
scanf(“%100[^\n]”,新的附件地址);
printf(“输入您的电话号码:”);
scanf(“%10d”和新的附件电话);
printf(“输入您的身份证号码:”);
scanf(“%10[0-9a-zA-Z]”,新附件id号);
printf(“输入您的职业:”);
scanf(“%50[^\n]”,新职业);
printf(“输入您的电子邮件地址:”);
scanf(“%s”,新附件电子邮件);
printf(“输入帐户类型:\n”);
printf(“\t#保存\n\t固定(1年)\n\t固定(2年)\n\t固定(3年)\n”);
scanf(“%20s”,新附件附件类型);
printf(“输入存款金额:$”;
scanf(“%d”和新账户余额);
文件*fp;
fp=fopen(“employees”,“a”);//以追加模式打开文件
if(fp==NULL)//如果文件无法打开
放置(“无法打开文件…”);
//在这里,我也使用while循环,但我不知道如何打破它,所以我使用for循环

对于(inti=0;i我在写入bin文件和从中读取时出错

首先我要感谢@lulle

  • 正如他在评论中提到的,我将struct中的
    char*
    更改为
    char
    数组
char首字母[80],姓名[250],电子邮件[100],acc_类型[25];
  • 我还更改了文件模式。我使用
    ab
    来编写代码段。在读取代码段时使用
    rb

  • 我改变了我的写作片段

在这里我循环了12次,这个记录每写12次。可悲啊? 这是因为我在
fwrite
中只使用了struct
&new\u acc
的地址。如果你在
fwrite``或
fread``中只使用了struct的地址,它会写下你的整个结构。这就是我的遭遇。我写了整个结构12次


用于(int i=0;我似乎只是在将帐户结构的内容写入文件。想想“name”、“initials”等字段是什么。它们只是指向您以前分配的内存的字符指针。当您将它们写入文件时,您只需存储地址,指针指向。相反,您要存储的是还有,写函数中的循环是怎么回事?这意味着当我使用
fread
fwrite
时,我不必使用
&
三元运算符。你要么在结构中使用固定大小的字符数组,而不是动态地为字符串分配内存,然后你就可以直接写str了uct到文件。或者您也可以将实际字符串(在您刚刚保存字符串指针的时候)写入文件。然后在从文件读取时,您读取结构,然后读取字符串并将指向字符串的指针重新斜体化,以便它们指向您刚从文件读取的字符串。