2017-08-30 3 views
0
FILE *fp; 

fp = fopen(filen, "wb"); 

const char tok[2] = ","; 
char str[340]; 

while (fgets(str, 340, stdin) != NULL) 
{ 
    struct test loadTest; 
    printf("You entered: %s", str); 
    strncpy(loadTest.level, strtok(str, tok), 20); 
    strncpy(loadTest.first, strtok(NULL, tok), 30); 
    fwrite(&loadTest, sizeof(struct test), 1, fp); 
} 

fclose(fp); 

Bonjour à tous,bloc Segmentation fault

Pour une raison quelconque, je reçois une erreur de segmentation fault dans mon code. Je suis presque certain que l'erreur est quelque part dans le petit bloc de code ci-dessus (puisque c'est tout ce que j'ai modifié pour la faute de seg), mais je n'arrive pas à le localiser. Je sais que les fautes de segmentation sont liées à l'accès à la mémoire auquel je ne devrais pas accéder, mais je ne suis pas sûr de l'endroit où je le fais dans le code.

Toute aide serait grandement appréciée!

+2

Avez-vous essayé de déboguer le code? – hrust

+4

Etes-vous sûr que la longueur des jetons est fixée à 20 et 30? – Lemonov

+0

Où vérifiez-vous que vous avez ouvert avec succès le fichier de sortie? –

Répondre

-1

Quelques améliorations de votre code

  • vérifier le résultat de fopen avant lecture/écriture dans le fichier
  • initialiser les variables avant d'utiliser leurs valeurs
  • utilisation sizeof au lieu de constante (comme mentionné dans les commentaires)
  • strtok() peut retourner NULL et cela doit être vérifié (voir here pourquoi)
  • vous mus t l'utilisation strncpy() soigneusement à cause de this

Voici la version corrigée de votre code

FILE *fp; 

fp = fopen(filen, "wb"); 

if (fp == NULL) 
{ 
    printf("Error opening file: %s", filen); 
} 
else 
{ 

    const char tok[2] = ","; 
    char str[340]; 

    while (fgets(str, sizeof(str), stdin) != NULL) 
    { 
     struct test loadTest; 
     char *level; 
     char *first; 
     memset(&loadTest, 0, sizeof(loadTest)); 
     printf("You entered: %s", str); 
     level = strtok(str, tok); 
     if (level == NULL) 
     { 
      continue; // bad input ? 
     } 
     first = strtok(NULL, tok); 
     if (first == NULL) 
     { 
      continue; 
     } 
     strncpy(loadTest.level, level, sizeof(loadTest.level)-sizeof(char)); 
     strncpy(loadTest.first, first, sizeof(loadTest.first)-sizeof(char)); 
     fwrite(&loadTest, sizeof(loadTest), 1, fp); 
    } 

    fclose(fp); 
} 
+0

Ce sont des améliorations mais ne pensent pas qu'elles arrêteront la faute de seg. Postez-les comme un commentaire. – i486

+0

@ i486 ce que je dois poster comme commentaire? J'ai déjà ajouté un commentaire à la question avant de poster une réponse. Je pense que segfault apparaît parce que le fichier n'est pas ouvert avec succès. 'fp' est NULL après' fopen'. –

+0

Vous pouvez seulement suspecter que 'fopen' est le problème. Ce n'est pas 100% sûr => la solution est pour le commentaire, ce n'est pas la réponse. – i486