尝试将结构保存到文件中

时间:2014-12-10 22:37:39

标签: c struct

#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功能将数据保存到文件时,程序崩溃了! 非常感谢你的帮助!

2 个答案:

答案 0 :(得分:1)

您的family.firstfamily.lastfamily.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会使此代码更简单一些。