Pb fichier, langage C
Résolu/Fermé
bizu53
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
-
12 avril 2009 à 19:20
lucieb31 Messages postés 345 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 28 juillet 2012 - 12 avril 2009 à 22:46
lucieb31 Messages postés 345 Date d'inscription mercredi 14 janvier 2009 Statut Membre Dernière intervention 28 juillet 2012 - 12 avril 2009 à 22:46
A voir également:
- Pb fichier, langage C
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier host - Guide
- Ouvrir fichier .bin - Guide
4 réponses
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
12 avril 2009 à 20:35
12 avril 2009 à 20:35
tu as essayé de changer le mode w en rw ?
sinon essaie avec fputc(c, out);
sinon essaie avec fputc(c, out);
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
12 avril 2009 à 21:32
12 avril 2009 à 21:32
Salut,
Pas étonnant, tu mets : sscanf(str, "%x", &c); alors que c est un char.
Les octets supplémentaires vont déborder et récrire dans la pile. Ainsi l'adresse du pointeur in ne sera plus la bonne. Et lors de la prochaine lecture par fread, cela fera un joli segfault.
A la place de char c, utilise unsigned int c (le format %x attend un type unsigned int).
Cela devrait mieux fonctionner.
De plus, while(nb != 0) est un peu dangereux. Il vaudrait mieux utiliser while(nb==1) puisque fread renvoie le nombre d'éléments lus. S'il y a une erreur ou la fin du fichier est atteinte, la valeur de retour sera plus petit que 0,sans forcément être nulle.
Cdlt
Pas étonnant, tu mets : sscanf(str, "%x", &c); alors que c est un char.
Les octets supplémentaires vont déborder et récrire dans la pile. Ainsi l'adresse du pointeur in ne sera plus la bonne. Et lors de la prochaine lecture par fread, cela fera un joli segfault.
A la place de char c, utilise unsigned int c (le format %x attend un type unsigned int).
Cela devrait mieux fonctionner.
De plus, while(nb != 0) est un peu dangereux. Il vaudrait mieux utiliser while(nb==1) puisque fread renvoie le nombre d'éléments lus. S'il y a une erreur ou la fin du fichier est atteinte, la valeur de retour sera plus petit que 0,sans forcément être nulle.
Cdlt
bizu53
Messages postés
1274
Date d'inscription
samedi 30 août 2008
Statut
Membre
Dernière intervention
21 juin 2015
860
12 avril 2009 à 22:28
12 avril 2009 à 22:28
"tu mets : sscanf(str, "%x", &c); alors que c est un char"
En effet mais comme je ne lui donne que 2 caractères en hexa je pensais que ça irait. En fait je n'avais pas pensé au débordement.
Je me suis en fait rendu compte qu'un sscanf(str, "%02x", &c); passe bien. J'aurais dû être plus rigoureux dans mon code pour le compilo :).
Merci
En effet mais comme je ne lui donne que 2 caractères en hexa je pensais que ça irait. En fait je n'avais pas pensé au débordement.
Je me suis en fait rendu compte qu'un sscanf(str, "%02x", &c); passe bien. J'aurais dû être plus rigoureux dans mon code pour le compilo :).
Merci
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
12 avril 2009 à 21:33
12 avril 2009 à 21:33
dsl je me suis trompé, c'est le mode wt que je voulais dire
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
12 avril 2009 à 21:36
12 avril 2009 à 21:36
c'est le mode wt que je voulais dire
Le mode wt n'existe pas non plus ^^.
Le mode wt n'existe pas non plus ^^.
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
12 avril 2009 à 21:37
12 avril 2009 à 21:37
si
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
12 avril 2009 à 21:44
12 avril 2009 à 21:44
T'as le choix entre : a, a+,r,r+,w,w+. Après tu peux utiliser ou pas b dans les modes précédents.
Mais t n'est pas standard et ne doit donc pas être utilisé.
Mais t n'est pas standard et ne doit donc pas être utilisé.
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
12 avril 2009 à 21:48
12 avril 2009 à 21:48
alors faudra que tu dise ça a mes profs de programmation, parce que c'est ecris dans mon cours, et on l'utilise lorsqu'on programme, ça permet de definir un fichier texte
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
>
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
12 avril 2009 à 22:10
12 avril 2009 à 22:10
Eh bien tes profs ne connaissent pas la norme.
Voici un extrait de la norme C99 pris sur le site officiel (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf pour t'en convaincre (il en va de même pour les autres).
Comme tu peux le voir, aucune mention du "t". Preuve que cela n'est pas standard. Pour le mode texte, a, w et r sont largement suffisant.
Voici un extrait de la norme C99 pris sur le site officiel (http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1124.pdf pour t'en convaincre (il en va de même pour les autres).
The argument mode points to a string. If the string is one of the following, the file is open in the indicated mode. Otherwise, the behavior is undefined.231) open text file for reading r truncate to zero length or create text file for writing w append; open or create text file for writing at end-of-file a open binary file for reading rb truncate to zero length or create binary file for writing wb append; open or create binary file for writing at end-of-file ab open text file for update (reading and writing) r+ truncate to zero length or create text file for update w+ append; open or create text file for update, writing at end-of-file a+ 231) If the string begins with one of the above sequences, the implementation might choose to ignore the remaining characters, or it might use them to select different kinds of a file (some of which might not conform to the properties in 7.19.2). r+b or rb+ open binary file for update (reading and writing) w+b or wb+ truncate to zero length or create binary file for update a+b or ab+ append; open or create binary file for update, writing at end-of-file
Comme tu peux le voir, aucune mention du "t". Preuve que cela n'est pas standard. Pour le mode texte, a, w et r sont largement suffisant.
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
12 avril 2009 à 22:24
12 avril 2009 à 22:24
merci pour cet eclaiciement, mais alors comment cela ce fait il qu'il n'y ai pas d'erreur lors de la compilation ?
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 844
12 avril 2009 à 22:39
12 avril 2009 à 22:39
mais alors comment cela ce fait il qu'il n'y ai pas d'erreur lors de la compilation ?
Tout d'abord tout dépend du compilateur que tu utilises. Certain respecte la norme, d'autre non. Ensuite, si certaines choses peuvent être détectées par le compilateur comme (void main au lieu d'int main, etc.), pour d'autre cas c'est beaucoup plus dur à détecter, notamment pour le code dynamique (arguments et compagnie).
Tout d'abord tout dépend du compilateur que tu utilises. Certain respecte la norme, d'autre non. Ensuite, si certaines choses peuvent être détectées par le compilateur comme (void main au lieu d'int main, etc.), pour d'autre cas c'est beaucoup plus dur à détecter, notamment pour le code dynamique (arguments et compagnie).
lucieb31
Messages postés
345
Date d'inscription
mercredi 14 janvier 2009
Statut
Membre
Dernière intervention
28 juillet 2012
62
>
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
12 avril 2009 à 22:46
12 avril 2009 à 22:46
ok merci de tes reponses
12 avril 2009 à 21:24
Le mode rw n'existe pas ;-))). Soit le mode r+, soit w+.