2012-09-14 26 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個字符的名稱或部門,緩衝區溢出可能會導致緩衝區溢出。