2012-09-14 92 views
0

我在C工作在Linux上,我试图给一个结构写入文件。问题写结构到文件

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

struct stud{ 
    char name[20]; 
    char dept[20]; 
    int id; 
}; 

int main() 
{ 
    FILE *fptr; 
    int fwrt; 
    struct stud s; 

    printf("enter student name\n"); 
    scanf("%s",s.name); 

    printf("enter student department\n"); 
    scanf("%s",s.dept); 

    printf("enter student ID\n"); 
    scanf("%d",&s.id); 

     fptr = fopen("tiger","wb"); 
     if(fptr == NULL){ 
      perror("error openning file :"); 
      exit(EXIT_FAILURE); 
     } 

     fwrt = fwrite(&s,sizeof(struct stud),1,fptr); 
     if(fwrt == 0){ 
      perror("error writing file :"); 
      exit(EXIT_FAILURE); 
     } 

     // fprintf(fptr, "%d", s1->mark); 

     if(fclose(fptr) == EOF){ 
      perror("error closing file :"); 
      exit(EXIT_FAILURE); 
     } 

} 

输出: 当我打开文件来检查我越来越:

  • ,但与其他字符
  • 部门但与其他字符
  • ID我得到一些垃圾值。

请让我知道解决这个问题的方式。

回答

0

您必须序列数据,加上“\ 0”到你的char []结束。

但FWRITE以二进制方式不方便动态结构,它的更好时,你可以静态地宣布你的结构的领域,所以你的情况这是很好的。

相反scanf函数,它的更好,如果你用fgets这样的:

#define MAX 
    if (fgets(s.name, MAX, stdin) == NULL) 
    { 
     //do what you want here 
    } 
    if (fgets(s.dept, MAX, stdin) == NULL) 
    { 
     //do what you want here 
    } 
+0

我不会使用fgets读取使用fwrite输出的结构。这是非常危险的。你应该改回它 –

1

输出:当我打开文件来检查我越来越:

  • 的名字我却用其他字符
  • 部门我有但其他字符
  • ID我有像一些垃圾值。

fwrite写入sizeof(struct stud)字节的文件,它并不关心这些字节包含。因为我们没有初始化s,将namedept阵列包含未指定的数据和没有被输入(包括0 - 终止子)覆盖保留他们的垃圾值的那些字节,那些被写入到文件太,因此附加namedept之后的字符。 id以二进制表示形式写入文件,当编辑器将其解释为文本时(看起来像垃圾)。

你应该然而警惕输入数组边界以外的写作,所以你应该限制在scanf格式字符串的长度,%19s,而不是%s确保了最多19个字符被扫描到20个字节数组,留下0终结者的位置。

0

使用

memset(&s, 0, sizeof(stud)); 

之前写入字符串先消毒数据,所以它不会显示出来,当您尝试进行打印。

原因id是完整的垃圾是因为即使它通过scanf以文本形式存储,您也可以以二进制形式写入文件。它应该也应该是一个字符串。

还指出,如果有人输入长度超过20个字符的名称或部门,缓冲区溢出可能会导致缓冲区溢出。