2010-12-09 48 views
0

我做了,其存儲結構的文件,但輸出是不是我的預期不同的程序,看看,的歸檔程序打印一些不必要的ASCII碼

/* 
    Students DataBase Program 
    Date:9th Dec,2010 
    Topic:Data base in C. 

*/ 
#include <stdio.h> 
int main() 
{ 
struct student 
{ 
    char name[20]; 
    int e_no; 
}stud; 
char temp[20],ch; 
FILE *fp; 
clrscr(); 
fp=fopen("D:\data1.txt","w+"); 
gotoxy(28,5); 
printf("\nNED CIS ENROLMENT DATABASE\t"); 
do 
{ 
    gotoxy(28,10); 
    printf("\nEnter name of the student:\t"); 
    gets(stud.name); 
    gotoxy(27,12); 
    printf("\nEnter your enrolment number:\t"); 
    gets(temp); 
    atoi(temp,stud.e_no,10); 
    fwrite(&stud,sizeof(stud),1,fp); 
    printf("\nWant to enter another record?[y/n]"); 
    ch=getche(); 
} 
while(ch=='y'||ch=='Y'); 
getchar(); 
fclose(fp); 
return 0;  
} 

輸出應該是名稱,學生的註冊號碼,但這裏是我每次輸入任何數據時獲得的輸出類型。

OUTPUT ON FILE:

慦慨d@〃݅@຦賅㈃愀慨d@〃݅@຦賅㈃ 
+0

你期望在文件中寫什麼? – karlphillip 2010-12-09 12:42:18

+0

名稱和註冊號 – 2010-12-09 13:49:57

+0

它將地址&stud上的內存轉儲寫入。 – BlackBear 2010-12-09 13:53:36

回答

2

兩件事情:

  1. 不要使用gets。它容易發生緩衝區溢出。

  2. 如果你想在文件中的數據是ASCII格式,你可能想要做像

    fprintf中(FP 「%s:%d \ n」,stud.name,螺柱。 e_no);

否則,它將打印數據的二進制表示(不可讀,不可移植)。

2
  1. atoi不採取三個參數。它需要一個(指向要轉換的字符串的指針)並返回它。它也被棄用 - 你應該使用strtol來代替。所以你的int stud_e沒有被設置。

  2. 您正在向文件寫入螺柱的內存/二進制內容,因此如果您在文本編輯器或屏幕上查看它將無法讀取(該名稱可能看起來不錯 - ish,但int(stud_e)將只打印對應於整數值的二進制數據的字符

  3. 獲取沒有邊界檢查,因此您正在閱讀的字符數量與用戶鍵入的字符數量相同如果鍵入的字符數超過20會踐踏其他領域的內存,從此以後的程序行爲是未定義的,可以做任何事情,你不應該使用gets(使用fgets或帶有限制的scanf代替)

  4. 良好做法將包括檢查的fopen/FWRITE/FCLOSE的返回值的錯誤