#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct data {
char *first;
char *last;
char *email;
int age;
struct data *next;
};
typedef struct data dat;
dat family;
dat family_array[4];
char array[100];
void menu(){
printf("\n1. Father\n");
printf("2. Mpther\n");
printf("3. Son 1\n");
printf("4. Son 2\n");
}
int mode_select(){
int x;
printf("\nMake your choice:");
scanf("%d" ,&x);
return x;
}
打开文件并返回其地址
FILE* load_read(){
FILE *fp;
fp=fopen("Family Data.dat" , "rb");
return fp;
}
FILE* write(){
FILE *fp;
fp=fopen("Family Data.dat" , "wb");
return fp;
}
读取struct
的数据dat new_data( const char *first , const char *last , const char *email , int age){
printf("\nGive first name: ");
scanf("%s" , array );
first=(char*)malloc((strlen(array)+1)*sizeof(char));
strcpy( &(family.first), array);
printf("\nGive last name: ");
scanf("%s" , array);
last=(char*)malloc((strlen(array)+1)*sizeof(char));
strcpy(&(family.last), array);
printf("\nGive email address: ");
scanf("%s" , array);
email=(char*)malloc((strlen(array)+1)*sizeof(char));
strcpy(&(family.email) , array);
printf("\nGive age: ");
scanf("%d" , &(family.age));
return family;
}
将数据从struct保存到文件
void save_to_file(FILE *fp , dat x){
fprintf(fp , "Dataaa:\n ");
fprintf(fp ,"Name: %s %s\n" , x.first , x.last);
fprintf(fp , "Email: %s\n" , x.email);
fprintf(fp , "Age: %d\n" , x.age);
}
将数据保存到数组
void save(x){
family_array[x-1]=new_data(family.first , family.last , family.email , family.age);
}
主要功能
int main(){
int x ,i;
FILE *fp;
for(i=0;i<4;i++){
mode();
x=mode_select();
fp=write();
save(x);
save_to_file(fp , family_array[i]);
}
fclose(fp);
return 0;
}
当使用save_to_file功能将数据保存到文件时,程序崩溃了! 非常感谢你的帮助!
答案 0 :(得分:1)
您的family.first
,family.last
和family.email
指针从未初始化,但您使用new_data
中的strcpy写入它们
目前还不清楚你要对new_data
的参数做什么,以及为什么你永远不会使用它们的值,而是用新分配的缓冲区替换它,你永远不会写入并永远不会释放
答案 1 :(得分:0)
new_data
函数是一个难以理解的混乱,也是错误的。它已经通过返回值返回它读取的所有信息,因此它不需要任何参数。
正确的方法是:
dat new_data(void)
{
dat item = { 0 };
char array[100]; // does not need to be global
printf("Give first name: ");
if ( 1 != scanf("%99s", array ) )
exit(EXIT_FAILURE);
item.first = malloc( strlen(array) + 1 );
strcpy(item.first, array);
// same for other items....
return item;
}
,save
中的代码为:
family_array[x-1] = new_data();
您的对象family
也不是必需的。
如果您希望new_data()
能够通过执行exit
以外的操作来从错误中恢复,那么您将需要返回成功/失败指示。 (并包含释放内存的额外代码)。
请注意,POSIX函数strdup
和/或getline
会使此代码更简单一些。