我需要为我正在上课的课程做作业。 这是C中的一个简单的电话本应用程序,我有一点麻烦,因为我需要在程序中使用一些新的东西,截止日期非常紧张。
我环顾四周,找到了一些答案,但每次都会出现一个新答案。 :)
这是我的(简化)计划:
typedef struct record
{
char fname[31];
char lname[31];
char tel[21];
struct record *next;
} record;
record *new_entry(record *first, char *fname, char *lname, char *tel)
{
record *new;
new=(record*) malloc(sizeof(record));
strcpy(new->fname, fname);
strcpy(new->lname, lname);
strcpy(new->tel, tel);
new->next=first;
}
void fileopen (char *db_file)
{
FILE *fp;
fp=fopen(db_file, "rb");
if (fp==NULL)
{
fp=fopen(db_file, "wb");
fclose(fp);
fp=fopen(db_file, "r+b");
}
}
int main
{
char db[51];
record *next = NULL;
printf("File: "); scanf("%s, db);
fileopen(db);
printf("First name: "); scanf("%s", fname);
printf("Last name: "); scanf("%s", lname);
printf("Phone number: "); scanf("%s", tel);
first=new_entry(*first, fname, lname, tel);
}
我遗漏了不必要的部分。 现在我知道它并不多,但我的班长说我应该使用二进制文件来存储和恢复数据。但是我真的很困惑,如果我应该如何使用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()中,我使用:
start=open(db, start);
声明部分:
record *start=NULL;
如果有人回复,再次感谢。
答案 0 :(得分:4)
要将链接列表写入文件,您可以浏览列表,然后编写结构。
#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;
}
stream
是您可以在wb
中使用fopen
模式打开的文件。
答案 1 :(得分:1)
所以,希望这项任务能够推动家庭为什么手动序列化/反序列化是一个糟糕的想法(在业界,实现此类事情的真正方法是通过自动代码生成,如protocol buffers),但对于为了完成这个任务的目的,你需要在不编写链接的情况下编写链表的内容,然后在反序列化时需要重新构建链接,因为简单地写下和读取下一个地址是不正确的。列表中的指针。
答案 2 :(得分:1)
将除*下一个指针之外的所有内容写入文件,然后按顺序将它们读回。
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()读取它并更新下一个指针。