2010-12-09 31 views
0

J'ai fait un programme qui stocke une structure dans un fichier, mais la sortie est différente de celle que je m'y attendais, un coup d'oeil,Un programme de dépôt d'impression du code ascii indésirable

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

La sortie doit être le nom et le numéro d'inscription de l'étudiant, mais voici le type de sortie que je reçois chaque fois que je saisis des données.

SORTIE DOSSIER:

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

Qu'espériez-vous écrire dans le fichier? – karlphillip

+0

Le nom et le numéro d'inscription –

+0

Il écrit le vidage de la mémoire à l'adresse & stud. – BlackBear

Répondre

2

Deux choses:

  1. Ne pas utiliser la gets. Il est sujet aux débordements de tampon.

  2. Si vous souhaitez que les données contenues dans le fichier à être sous forme ascii, vous voulez sans doute faire quelque chose comme

    fprintf (fp, "% s:% d \ n", stud.name, goujon. e_no);

sinon, il imprimera la représentation binaire de vos données (non lisible par l'homme, et nonportable).

+0

qu'en est-il de fwrite()? –

2
  1. atoi ne prend pas trois arguments. Il en prend un (le pointeur vers la chaîne à convertir) et retourne un it. C'est aussi obsolète - vous devriez plutôt utiliser strtol. Donc votre int stud_e ne se règle pas. Vous écrivez le contenu en mémoire/binaire de stud dans le fichier, donc si vous regardez dans un éditeur de texte ou sur l'écran, il sera illisible (le nom sera probablement ok-ish, mais int (stud_e) imprime simplement les caractères qui correspondent aux données binaires de la valeur entière

  2. Gets n'a pas de vérification des limites, donc vous lisez autant de caractères que l'utilisateur saisit.Si ils tapent plus de 20 va piétiner sur d'autres zones de la mémoire et le comportement du programme à partir de ce moment est indéfini et pourrait faire n'importe quoi.Vous ne devriez pas utiliser gets (utiliser fgets ou scanf avec une limite à la place)

  3. bonnes pratiques comprendrait la vérification des valeurs de retour de fopen/fwrite/fclose pour les erreurs

+0

Merci beaucoup pour les informations précieuses. –