Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读写malloc';从/到二进制文件的d链表_C_File_Struct_Binary - Fatal编程技术网

读写malloc';从/到二进制文件的d链表

读写malloc';从/到二进制文件的d链表,c,file,struct,binary,C,File,Struct,Binary,我需要为我要上的课做一个作业。 这是一个简单的C语言电话簿应用程序,我有点麻烦,因为我需要在程序中使用一些新的东西,而且截止日期很紧 我环顾四周,找到了一些答案,但每次都有一个新的答案出现 这是我的(简化)程序: 我漏掉了不重要的部分。 现在我知道这并不多,但我的班长说我应该使用二进制文件来存储和恢复数据。但我真的很困惑,如果我应该如何使用fread和fwrite 非常感谢您的解决方案!我想我开始理解这个概念了。 该程序现在存储数据(至少我认为是这样,因为随着我添加更多数据,文件会不断增长。)

我需要为我要上的课做一个作业。 这是一个简单的C语言电话簿应用程序,我有点麻烦,因为我需要在程序中使用一些新的东西,而且截止日期很紧

我环顾四周,找到了一些答案,但每次都有一个新的答案出现

这是我的(简化)程序:

我漏掉了不重要的部分。 现在我知道这并不多,但我的班长说我应该使用二进制文件来存储和恢复数据。但我真的很困惑,如果我应该如何使用fread和fwrite


非常感谢您的解决方案!我想我开始理解这个概念了。 该程序现在存储数据(至少我认为是这样,因为随着我添加更多数据,文件会不断增长。) 当启动一个新的二进制文件时,程序会在请求时正确显示数据,但是如果我关闭它,然后重新打开同一个文件,当它试图列出联系人时,不会发生任何事情

以下是(再次简化,我在实际分配中的一条记录中有10个细节)打开函数:

record *open (char *db_file, record start)
{
  FILE *fp
  record *temp = start;
  fp=fopen(db_file, "rb");
  while (fread(temp, sizeof(rekord), 1, fp)>0) 
    {
        fread(temp->fname, sizeof temp->fname, 1, fp);
        fread(temp->lname, sizeof temp->lname, 1, fp);
        fread(temp->tel, sizeof temp->tel, 1, fp);
    temp=temp->next;
    }
  fclose(fp);
  return temp;
}
在main()中,我使用:

宣言部分:

record *start=NULL;

如果有人回复,再次感谢。

因此,希望本作业能让大家明白为什么手动序列化/反序列化是一个糟糕的主意(在业界,实现这类事情的真正方法是自动生成代码,例如),但出于本作业的目的,您需要在不写入链接的情况下写入链接列表的内容,然后在反序列化时需要重新构建链接,因为简单地写入和读取列表中下一个指针的地址是不正确的。

将除*下一个指针之外的所有内容写入文件,然后按顺序读出来

void write_book(const record *start) {
   FILE *f;
   record end;
   memset(end,0,sizeof(struct record));
   f = fopen("foo","wb");
   for(;start != NULL; start = start->next) { 
     fwrite(start->fname, 31, 1, F);
     fwrite(start->lname, 31, 1, F);
     fwrite(start->tel, 21, 1, F);
     fwrite(end->next, sizeof(void*), 1, F);
   }
   memset(end,0,sizeof(struct record));
   fwrite(end, sizeof(struct record),1,F);
   fclose(f);
}

读取时,读取数据,直到找到空记录。你可以用fread()来做这个。只要记住分配新记录,用fread()读取它并更新下一个指针

要将链接列表写入文件,可以遍历列表,然后编写结构

#include <stdio.h>

record *it = first;

while (it != NULL) {
    fwrite (it->fname, sizeof it->name, 1, stream);
    fwrite (it->lname, sizeof it->lname, 1, stream);
    fwrite (it->tel, sizeof it->tel, 1, stream);
    it = it->next;
}
#包括
记录*它=第一个;
while(it!=NULL){
fwrite(it->fname,sizeof it->name,1,stream);
fwrite(it->lname,it的大小->lname,1,流);
fwrite(it->tel,it的大小->tel,1,stream);
it=it->next;
}

stream
是一个可以在
fopen

中以
wb
模式打开的文件,欢迎使用StackOverflow。您必须使用
fread
fwrite
?是否允许您使用
fscanf
/
fprintf
?另外你忘记了你的具体问题,目前你的帖子只是一个问题描述到新的_条目()的末尾。到底是什么问题?Fread&write prototype as r_w(*ptr,size_t size_of u one_record,size_t how many,FILE*FILE_pointer),您应该在函数中使用
strncpy
而不是
strcpy
。顺便说一句,当填充固定大小的字段时,它是该函数的确切用例。如果它是一个
结构如何?
void write_book(const record *start) {
   FILE *f;
   record end;
   memset(end,0,sizeof(struct record));
   f = fopen("foo","wb");
   for(;start != NULL; start = start->next) { 
     fwrite(start->fname, 31, 1, F);
     fwrite(start->lname, 31, 1, F);
     fwrite(start->tel, 21, 1, F);
     fwrite(end->next, sizeof(void*), 1, F);
   }
   memset(end,0,sizeof(struct record));
   fwrite(end, sizeof(struct record),1,F);
   fclose(f);
}
#include <stdio.h>

record *it = first;

while (it != NULL) {
    fwrite (it->fname, sizeof it->name, 1, stream);
    fwrite (it->lname, sizeof it->lname, 1, stream);
    fwrite (it->tel, sizeof it->tel, 1, stream);
    it = it->next;
}