segmentation fault - C++ - Programmation
Marsh Posté le 10-02-2003 à 07:27:26
Au lieu de balancer le sujet, le nom de ton prof, la couleur du slip de ta copine et autres, isole le bout de code qui foire, selon toi, et donne la trace (l'erreur, je veux dire le nom de l'erreur et sa description). Parce que là comme ça, ça donne pas envie de lire, même si ça a l'air simple a priori.
Marsh Posté le 10-02-2003 à 08:36:50
bah le bout de code qui foire c quand je lance le programme avec les paramètres.
si je mes en second paramètre (celui qui s'ouvre en lecture) un nom de fichier non valide, il me retourne bien mon message d'erreur, tandis que si je mes en second paramètre un nom de fichier valide il m'affiche segmentation fault dés le début du programme. si je mes un printf("ada" ); tout de suite après le { en dessous du main il me l'affiche même pas.
pourtant j'ai vérifié j'ai bien les droits sur ce fichier.
Marsh Posté le 10-02-2003 à 12:42:19
Je vois déjà un souci là :
Code :
|
1. Tu définis carlu comme une chaîne de 1 caractère. Pas glop ça, une chaine de 1 caractère prend 2 octets (pas oublier le '\0' à la fin). Autant le read ne devrait pas trop râler (par contre attention, il ne devrait pas mettre le '\0' à la fin de la chaîne), autant le strcat derrière ne va pas être content du tout => joli jardinage mémoire en perspective, ce qui pourrait expliquer le segfault.
2. On compare les chaînes de caractères avec un strcmp, pas avec un "!=" ou un "==". si tu veux comparer le caractère de ton carlu, soit tu passes par un strcmp, soit tu testes carlu[0] != '\n'
Petite question : pourquoi ne pas passer par les fopen, fread & cie pour ton fichier ?
Marsh Posté le 10-02-2003 à 13:28:17
disons qu'on a pas encore vu le cours avec les fopen et compagnie. mais bon tant pis vais essayer avec fopen et fread.
petite question pratique : fread lit un fichier ligne par ligne ?
Marsh Posté le 10-02-2003 à 13:32:43
LordAnkou a écrit : si je mes un printf("ada" ); tout de suite après le { en dessous du main il me l'affiche même pas. |
le flux de sortie est bufferisé pour des raisons évidentes de perfs. mets printf("ada\n" ); plutot tu verras tout de suite mieux
Marsh Posté le 10-02-2003 à 13:32:47
fread lit le nombre d'octet que tu lui file en parametre (no more, no less )
Marsh Posté le 11-02-2003 à 06:41:51
lorill a écrit : mets printf("ada\n" ); plutot tu verras tout de suite mieux |
Ça ne garantit pas le flush, il faut le spécifier:
Code :
|
Marsh Posté le 10-02-2003 à 00:31:53
bon voila pour résumer :
le sujet :
Spécification Externe :
Etant donné un fichier dont les lignes sont organisées comme suit :
- 1ere ligne : identite d'un joueur de foot
- 2eme ligne : identite du club de ce joueur
- 3eme ligne : identite d'un joueur de foot
- 4eme ligne : identite du club de ce joueur
Ecrire un programme qui prendra en paramètre le nom du fichier
contenant les joueurs et le nom du fichier résultat dans lequel on
mettra sur chaque ligne le joueur associé à son club.
Spécification Interne :
1/ Stratégie
--> on supposera que tous les joueurs ont un club et que chaque club à
un joueur. cela veut donc dire qu'il y a un nombre pair de ligne
et que chaque ligne contient un nom de joueur ou un club. (ce
n'est pas au programme de gérer les erreurs dans le fichier de données)
nb_ligne : comptera le nombre de ligne lue et init à 0
la fonction main prendra en paramètre deux noms de fichiers (sur 10
caractère) qui seront le fichier de donnée (nom_donnees) et le fichier
resultat (nom_resultat).
ensuite :
les fonctions ci dessous ne se dérouleront que si argc = 3 sinon on ne
fait rien
ouverture du fichier nom_donnees en lecture seule. (fd)
ouverture du fichier nom_resultat en création. (fr)
si fd < 0 alors
afficher le message ("erreur : fichier non existant. impossible de l'ouvrir" );
retourne (-fd) et sortir du programme
si fr < 0 alors
afficher le message ("erreur : fichier déjà existant." );
retourne (-fr) et sortir du programme
sinon
boucle
lire la première ligne -> nom_joueur
nb_ligne ++
lire la seconde ligne -> nom_club
nb_ligne ++
si nom_joueur & nom_club > 0 alors faire
concaténer nom_joueur + nom_club -> nom_joueur_club
enregistrer nom_joueur_club
si nom_joueur & nom_club < 0 et (nb_ligne mod 2) = 0 alors faire
sortir de la boucle et retourner 0
si nom_joueur & nom_club < 0 et (nb_ligne mod 2) != 0 alors faire
afficher un message d'erreur ("Structure du fichier non valide" )
retourner (-nb_ligne);
sortir de la boucle
fin de si
fin de boucle
fin de si
2/ Elements
nom_donnes : char [10] -> nom du fichier données
nom_resultat : char [10] -> nom du fichier résultat
fd, fr : variable entière initialisé à 0
nom_joueur : char [30] -> variable pour la lecture du nom du joueur
nom_club : char [30] -> variable pour la lecture du nom du club
nom_joueur_club : char [60] -> variable contenant le nom du joueur et
son club
nb_ligne : nombre de ligne depuis le début du fichier et initialisé à 0
le programme :
et l'erreur :
quand je lance le prg avec par exemple :
TP3 donne resultat
avec donne contenant des valeurs il me retourne segmentation fault
et ensuite le problème (pendant un temps ça a marché...) c qu'il ne trouve pas le caractère de "\n" à la fin de chaque ligne lu.