C 将文件保存到结构中
我有一个程序,我想在其中读取和保存数据到。理想情况下,我希望读取数据,能够显示数据并对其进行更改,然后能够在需要时将其保存回另一个文件。现在我可以读取数据,但我不能进行更改或将内容保存到另一个文件。我不会让你发布我的全部代码,因为它相当长,但这里是我的结构,主要功能,菜单功能和阅读功能C 将文件保存到结构中,c,structure,C,Structure,我有一个程序,我想在其中读取和保存数据到。理想情况下,我希望读取数据,能够显示数据并对其进行更改,然后能够在需要时将其保存回另一个文件。现在我可以读取数据,但我不能进行更改或将内容保存到另一个文件。我不会让你发布我的全部代码,因为它相当长,但这里是我的结构,主要功能,菜单功能和阅读功能 typedef struct friends_contact{ char *First_Name; char *Last_Name; char *home; char *cell; }fr;
typedef struct friends_contact{
char *First_Name;
char *Last_Name;
char *home;
char *cell;
}fr;
int main() {
fr friends[5];
char buffer[BUFFSIZE];
int counter=0;
int i=0;
menu(friends, &counter,i,buffer);
getch();
return 0;
}
//Menu function
void menu(fr*friends,int* counter, int i,char buffer[]) {
int user_entry=0;
int user_entry1=0;
int user_entry2=0;
char user_entry3[50]={'\0'};
FILE *read;
printf("Welcome! Would you like to import a file? (1)Yes or (2) No");
scanf("%d",&user_entry1);
if(user_entry1==1)
{
printf("Please enter a file name");
scanf("%s",user_entry3);
read=fopen(user_entry3,"r");
}else;
do{
int result;
printf("\nPhone Book Application\n");
printf("1) Add friend\n2) Delete friend\n3) Show a friend\n4) Show phonebook\n5)Exit\n");
scanf("%d", &user_entry);
if(user_entry==1)
{
add_contact(friends,counter,i,buffer);
}
if(user_entry==2)
{
delete_contact(friends ,counter,i);
}
if(user_entry==3)
{
result=show_contact(friends ,counter,i);
if(result==0)
{
printf("\nName not Found\n");
}else
result;
}
if(user_entry==4)
{
print_contact(friends, counter,i,user_entry3);
if(user_entry1==1){
file2(friends ,counter,i,buffer,read);
}else;
}
}while(user_entry!=5);
if(user_entry==5)
{
fclose(read);
printf("Would you like to save entries to a file? (1)yes or (2) no");
scanf("%d",&user_entry2);
if(user_entry2 == 1)
{
printf("Please name your file");
scanf("%s",user_entry3);
file(friends, counter,i,user_entry3);
printf("Goodbye!");
}else if(user_entry2 == 2)
{
printf("Goodbye!");
}
}
}
我的阅读功能:
char file2(fr*friends ,int* counter, int i,char buffer[],FILE*read){
fseek(read, 0, SEEK_SET);
while (fscanf(read, "%s", buffer) != EOF)
{
friends[i].First_Name=malloc(BUFFSIZE*strlen(buffer));
strcpy(friends[i].First_Name, buffer);
printf("%s\n",friends[i].First_Name);
}
}
正如我所说,现在我可以查看文件的内容,但我不能编辑它们,甚至不能将它们输出到另一个文件。我的代码中也可能有不完美的地方,但在我担心进行其他更改之前,我正试图关注这一点(因为程序的工作超出了所提到的问题)。我已经准备好发一个大大的绿色对勾了!:) 如果要编辑应用程序中的字符串,请记住,在需要时必须注意增加缓冲区。使用固定长度的记录(并用零填充字符串)可能更合理。然后,您只能检查是否没有溢出缓冲区的末尾,并使用
fread()
和fwrite()
一次性从文件读取/转储fr
结构(基本上是读取/写入sizeof(fr)
,除非您在具有不同端点的计算机上运行应用程序,否则它是安全的)
也就是说,有几个注意事项:
- 如果(user_entry==x),请使用
开关,而不是多个
,在
其他部分中执行操作(打印警告或其他任何内容)-它通常表示代码中存在常规分支或错误分支
- 使用
,指定可以放入fscanf中的宽度(读取,“%s”,buffer)
的最大字符串长度,请记住,buffer
字符串终止符不计入此值,因此需要使用buffer-1的大小。即,将其硬编码为,例如:'\0'
,或在运行时编译正确的格式字符串%50s
可能不是您真正想要分配的大小malloc(BUFFSIZE*strlen(buffer))
- 始终检查
返回值强>malloc()