2014-12-10 55 views
0
#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; 
} 

的结构中读取数据

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; 
} 

从结构将数据保存到文件

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; 
    } 

的PROGRAMM崩溃,当它的时间来保存数据与save_to_file机能的研究,以文件! 非常感谢您的帮助!

+0

不要命名你的函数write()。这是写入文件的Linux低级功能。但我不认为这是导致你的问题,stdio应该是安全的这个名称冲突。 – Barmar 2014-12-10 22:43:49

+0

您是否尝试过附加调试器并逐步执行该程序? – Barett 2014-12-10 22:45:31

+0

您是否曾尝试在调试器中运行该程序,并查看'save_to_file'函数中的变量值? – Barmar 2014-12-10 22:45:49

回答

1

family.firstfamily.lastfamily.email指针永远不会初始化,但你写信给他们使用的strcpy在new_data

目前还不清楚你正在尝试与new_data参数做的,为什么你从来没有使用自己的价值但用一个新分配的缓冲区替换它,它永远不会写入,也不会释放

+0

你击败了我,galinette。我认为new_data中的malloc应该为这些分配内存。我可能会传入一个指向数据结构的指针,而不是使用指向内容的const指针。 – Resource 2014-12-10 22:53:09

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会使此代码更简单一些。

+0

通过debbuging程序显示我一切正常,直到save_to_file()打开为止!我试图打开文件里面的功能,但没有任何改变..任何想法呢?'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); }' – 2014-12-11 10:22:49

+0

调试器会告诉你问题是什么。在保存 – 2014-12-11 19:25:17

+0

@KonstantinosTsirakos时,检查fp,x.first,x.last等是否为空,您还应验证'x'实际上在范围'1'到'4'中,否则'family_array [x- 1]'是一个越界访问 – 2014-12-11 19:26:09

相关问题