2017-09-11 2 views
-3

J'ai écrit ce code pour obtenir les informations d'un utilisateur et l'enregistrer sous forme de fichier texte.C: Erreur de segmentation

int main(){ 
    FILE *fp; 
    fp = fopen("rahiv.txt", "w"); 
    char s[80]; 
    char a; 
    gets(s); 
    a = s ; 
    fputs(s, fp); 
} 

Mais si je veux écrire la partie fputs comme ci-dessous, il me donne une erreur de segmentation, comment la valeur de retour de la fonction obtient typecast() et résoudre ce problème!

int main(){ 
    FILE *fp; 
    fp = fopen("rahiv.txt", "w"); 
    char s[80]; 
    fputs(gets(s), fp); 
} 
+5

Quelle était votre intention avec 'a = s;'? Suggestion: activez tous les avertissements dans votre compilateur et configurez-les pour les traiter comme des erreurs. – Groo

+5

Comment savez-vous que le fichier a été ouvert avec succès? – John3136

+2

Je remets en question la santé mentale de 'a = s;', et cela pâlit par rapport à l'absence de sens dans l'utilisation de ['gets'] (http://en.cppreference.com/w/c/io/gets) Quoi qu'il en soit, une fonction si mauvaise et si vile qu'elle a été * enlevée * de la bibliothèque standard il y a des années. Vous semblez être une âme plutôt confiante, comme «fopen» n'est pas garanti pour réussir, ni «get», mais vous semblez croire que les deux réussiront et ne vérifieront jamais leurs résultats. – WhozCraig

Répondre

2

Ceci est un code dangereux. Je vais essayer d'aborder les choses dans l'ordre, et j'espère répondre à votre question quelque part dans le processus.

1) Vous devez vous assurer que le fichier ouvert avec succès. Ce n'est pas sympa comme Java/C#/Python/autres langages de haut niveau où il va lancer une exception. Vous devez cocher if(fp == NULL) { /*handle error*/ }

2) Vous essayez d'égaler vos variables a et s, qui sont de types différents et non équivalents. char s[80] alloue un tableau de caractères 80 octets de long sur la pile. Il ressemble à s est de type char, mais il est en fait de type char*, donc la ligne a = s ... eh bien, je ne sais pas ce qu'il fait.

3) gets peut revenir plus que la chaîne. From the docs

En cas de réussite, la fonction renvoie str. Si la fin de fichier est lors de la tentative de lire un caractère, l'indicateur EOF ensemble (feof). Si cela se produit avant que des caractères puissent être lus, le pointeur renvoyé est un pointeur nul (et le contenu de str reste inchangé). Si une erreur de lecture se produit, l'indicateur d'erreur (ferror) est et un pointeur nul est également renvoyé (mais le contenu pointé par str peut avoir changé).

Essayer de passer la valeur de retour directement dans fputspourrait travail si vous êtes chanceux et tout est correct, mais s'il y a une erreur, il va sauter. Dans les langages de plus haut niveau, il y a beaucoup de tentation de passer les résultats d'une méthode directement dans le paramètre d'une autre méthode, mais en C cela finit souvent mal parce qu'il n'y a pas d'essai/catch, donc les erreurs sont souvent retournées. la valeur de retour. N'essayez pas de le rendre plus compact, favorisez le code plus long et mettez dans tous les cas de test appropriés pour des erreurs!

4) Vous ne fermez le fichier. Assurez-vous d'appeler le fclose(fp);, sinon vous causerez une fuite de mémoire et possiblement un comportement indésirable si votre programme tombe en panne, causant la perte des données que vous avez écrites.