2012-11-23 75 views
2

如何将值传递给结构变量我试图从用户获取员工信息,然后将其写入文件中,但输入员工姓名后我得到segmentation fault。 这是我的代码。如何将值传递给结构变量,然后将结构写入文件?

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

struct record_em{ 
    int id; 
    char name[20]; 
    int salary; 
    int age; 
}; 

int main(void) 
{ 
    struct record_em employee; 
    FILE *fp; 
    int id, salary, age; 
    char name[20]; 
    int n=1; 

    fp = fopen("empRecord.dat","a"); 
    while(n==1){ 
     printf("\nEnter Employee ID\n"); 
     scanf("%d",&id); 
     employee.id=id; 
     printf("\nEnter Employee Name\n"); 
     scanf("%s",name); 
     employee.name=name; 
     printf("\nEnter Employee Salary\n"); 
     scanf("%d",&salary); 
     employee.salary=salary; 
     printf("\nEnter Employee Age\n"); 
     scanf("%d",&age); 
     employee.age=age; 
     fwrite(&employee,sizeof(employee),1,fp); 
     printf("Enter 1 to add new record \n"); 
     scanf("%d",&n); 
    } 

    fclose(fp); 

    return 0; 
    } 

输出(从评论拍摄):

 
Fatmahs-MacBook-Air:~ fatmah$ gcc -o em em.c 
Fatmahs-MacBook-Air:~ fatmah$ ./em 
Enter Employee ID 
88 
Enter Employee Name 
uu 
Segmentation fault: 11 
+2

我不明白,因为这不应该请编译如何发生分段错误:'employee.name =名称;'。这是_exact_代码吗? – hmjd

+0

是,'Fatmahs-的MacBook空中:〜fatmah $ gcc的-o EM em.c Fatmahs-的MacBook空中:〜fatmah $ ./em 输入员工ID 输入员工姓名 UU 分段故障:11' – fatimah

+0

请参阅http://ideone.com/3JvSwG for _error:assignment_编译器失败消息中的不兼容类型。 – hmjd

回答

6

变化

scanf("%s",name); 
employee.name=name; 

scanf("%s",name); 
strcpy(employee.name, name); 

中,更好的是,由Dukeling &建议hmjd

scanf("%19s", employee.name); 
+2

刚刚'scanf(“%s”,employee.name)''怎么样?小心缓冲区溢出。 – Dukeling

+0

@Dukeling好点,那会更好 – simonc

+1

再好一点:'scanf(“%19s”,employee.name);'以避免缓冲区溢出。 – hmjd

3

这是一个大问题:

scanf("%s",name); 
employee.name=name; 

成员name阵列,你不能给它分配。请使用strcpy复制即可。

+0

谢谢它的作品,但它写了一个垃圾文件! – fatimah

0
  1. 创建 typedef结构record_t使事情变得更短,更容易理解。

    typedef struct { 
        int id; 
        char name[20]; 
        int salary; 
        int age; 
    } record_t; 
    
  2. 创建文件,并首先进行格式化。

    void file2Creator(FILE *fp) 
    { 
        int i; // Counter to create the file. 
        record_t data = { 0, "", 0, 0 }; // A blank example to format the file. 
    
        /* You will create 100 consecutive records*/ 
        for(i = 1; i <= 100; i++){ 
         fwrite(&data, sizeof(record_t), 1, fp); 
        } 
    
        fclose(fp); // You can close the file here or later however you need. 
    } 
    
  3. 编写函数来填补文件。

    void fillFile(FILE *fp) 
    { 
        int position; 
        record_t data = { 0, "", 0, 0 }; 
    
    
        printf("Enter the position to fill (1-100) 0 to finish:\n?"); 
        scanf("%d", &position); 
    
        while(position != 0){ 
         printf("Enter the id, name, and the two other values (integers):\n?"); 
         fscanf(stdin, "%d%s%d%d", &data.id, data.name, data.salary, data.age); 
    
         /* You have to seek the pointer. */ 
         fseek(fp, (position - 1) * sizeof(record_t), SEEK_SET); 
         fwrite(&data, sizeof(record_t), 1, fp); 
         printf("Enter a new position (1-100) 0 to finish:\n?"); 
         scanf("%d", &position); 
        } 
    
        fclose(fPtr); //You can close the file or not, depends in what you need. 
    } 
    

您可以使用此作为参考Comparing and checking columns in two files

+0

非常感谢,但它并没有写入整数! – fatimah