bloodhand Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 Bonjour !!! Je suis niveau débutant en langage C et je m'entraîne en ce moment sur des petits défis que je me lance pour pouvoir passer à + compliquer au fur et à mesure. Si quelqu'un peut m'aider ca serait vraiment sympas :) Je vous remercie d'avance. Donc mon programme consiste à faire une structure avec a l intérieur nom et prenom. Je fais une fonction "taper au clavier" pour pouvoir ecrire dans la structure. Ecrire la structure dans un fichier. (Je n'ai pas encore fait la fonction ecrire la structure dans le fichier). #include <stdio.h> //Structure avec juste le nom et le prenom. typedef struct individu { char nom; char prenom; }personnes; //fonction pour taper au clavier (scanf n'étant pas génial). void type_keyb(char *buffer) { while((*buffer++ = getchar())!= '\n') *(--buffer) = '\0'; } // fonction pour écrire dans la structure void write_struct(personnes *personne) { type_keyb(personne->nom); type_keyb(personne->prenom); } //fonction principale incomplète. Je fais mes fonctions au fur et à mesure pour pas avoir trop d'erreur lors de la compilation. int main() { FILE * file01; int i; file01= fopen("file", "a"); fprintf(file01,"tralala \n"); //ligne pour tester l'écriture dans le fichier (juste pour voir si ca marche) fclose(file01); return 0; } VOici les erreurs : nom.c: Dans la fonction « write_struct »: nom.c:29: attention : passage de l'argument n°1 de « type_keyb » transforme un entier en pointeur sans transtypage nom.c:30: attention : passage de l'argument n°1 de « type_keyb » transforme un entier en pointeur sans transtypage nom.c:47:18: attention : pas de retour chariot à la fin du fichier Lien vers le commentaire Partager sur d’autres sites More sharing options...
Fab23 Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 Salut, déjà si tu vx faire dans les règles de l'art tu mets tout en-haut ton "main" et après les fonctions (je sais pas si ça fonctionne sinon...)... EDIT: Il te manque certainement une bibliothèque que tu n'as pas inclue... Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 21 août 2005 Auteur Partager Posté(e) le 21 août 2005 j ai essayé de rajouter plusieurs librairies mais ça ne marche toujours pas. #include <stdlib.h> #include <string.h> Je pense que tout est dans stdio.h D'aprés l'erreur il me dit que je transforme un entier en pointeur. Il faudrait peut etre un strcmp ou un truc dans le genre mais je suis pas sûr. J ai toujours eu des problèmes avec les pointeurs ^^' (L'ordre du main n'est pas important. C juste un choix pour moi. ) Lien vers le commentaire Partager sur d’autres sites More sharing options...
cryptonym Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 Il faut que tu passes un pointeur en parametre donc : void write_struct(personnes *personne) { type_keyb(&(personne->nom)); type_keyb(&(personne->prenom)); } mais ton code va segfaulter ta fonction void type_keyb(char *buffer) va ecrire en dehors si tu l'utilises comme ca. Lien vers le commentaire Partager sur d’autres sites More sharing options...
LePhasme Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 Tu devrais utiliser scanf si tu es debutant, c'est beaucoup plus simple et ca fonctionnera très bien pour ce que tu veux faire la. Lien vers le commentaire Partager sur d’autres sites More sharing options...
keneda212 Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 un debutant !!! ptain le code, c'est pas pour debutant ca. bon je vais tenter de le lire puis de t'aider Lien vers le commentaire Partager sur d’autres sites More sharing options...
lulu1664 Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 pour: file01= fopen("file", "a"); remplacer par : file01= fopen("file", "w"); pour le coup du bufffer je suis pas sur non plus Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 21 août 2005 Auteur Partager Posté(e) le 21 août 2005 dsl d avoir mis tt ce temps pour repondre. Déjà merci à tous ceux qui m'ont répondu :) En fait le problème venait de la structure. la définition du nom et du prenom. Il fallait mettre nom[128] et prenom[128] histoire de donner une chaîne de caractere et non un caractere tt seul. le fil01=fopen("file","a") je l utilise pour pouvoir mettre les chaînes de caractère l'une a la suite de l'autre dans le fichier. Sinon il remplace tout et je ne peux plus m'en servir. J'ai refait le code cet aprem. Voila ce que ca donne. En resumé j ecris la structure dans le fichier ensuite je parcours le fichier. #include <stdio.h> #include <stdlib.h> #include <string.h> //Structure avec juste le nom et le prenom. typedef struct { char nom [128]; char prenom[128]; }personnes; //fonction pour taper au clavier (scanf n'étant pas génial). void type_keyb(char *buffer) { while((*buffer++ = getchar())!= '\n'); *(--buffer) = '\0'; } // fonction pour écrire dans la structure void write_struct(personnes *personne) { type_keyb(personne->nom); type_keyb(personne->prenom); } // fonction ecrire dans un fichier void write_file(FILE *fichier, personnes *individu) { fprintf(fichier, "%s\n%s\n", individu->nom, individu->prenom); } //parcourir le fichier void parcourir_fichier(FILE *parcours) { while( !feof(parcours) ) { printf("%c",fgetc(parcours)); } } //fonction principale incomplète. Je fais mes fonctions au fur et à mesure pour pas avoir trop d'erreur lors de la compilation. int main() { personnes *osef; FILE *file01; osef = malloc(sizeof(personnes)); file01= fopen("file", "a"); write_struct(osef); write_file(file01, osef); fclose(file01); file01= fopen("file", "r"); parcourir_fichier(file01); fclose(file01); return 0; } Un autre problème. J'ai résolu le ptit problème mais j'ai un bug que j'ai mis dix ans a chercher sans résultat. Quand j'affiche dans la console (debian) ce qu'il y a dans le fichier, il me rajoute un "Y" avec deux points au dessus. C'est juste un petit bug mais voulant une certaine rigueur dans mon travail, je n'aime pas trop les bugs. Si quelqu'un a déjà rencontré le problème ca serait vraiment super. Merci encore. Lien vers le commentaire Partager sur d’autres sites More sharing options...
fabien29200 Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 Tu pourrais préciser plus ?? Tu pourrais mettre la trace de ton pb ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
fozzie Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 je pense que le retour chariot une fois que tu as saisi le nom ou le prénom est codé sur 2 caractères. (retour en début de ligne et saut de ligne). je ne sais plus, mais tu dois avoir un \a ou un \r en plus. tu peux vérifier ça avec strlen (ou printf %x). Lien vers le commentaire Partager sur d’autres sites More sharing options...
fozzie Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 pour vérifier le contenu du fichier, tu peux faire "od -c file" ou "od -x file" Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 21 août 2005 Auteur Partager Posté(e) le 21 août 2005 donc voici ce qui est affiché a la fin du fichier : test <-- le nom test2<-- le prenom ÿ <-- le bug (fin de fichier) je pense que le retour chariot une fois que tu as saisi le nom ou le prénom est codé sur 2 caractères. (retour en début de ligne et saut de ligne).je ne sais plus, mais tu dois avoir un \a ou un \r en plus. tu peux vérifier ça avec strlen (ou printf %x). Je dois avouer que la je suis un peu perdu ^^' Je suis allé dans le "man" pour strlen et c'est donc pour calculer la longueur d'une chaîne de caractère. Mais je ne vois pas exactement comment l'utiliser ici. Et printf %x m affiche plein de chiffre et c'est assez déroutant. Je ne l'utilise peut etre pas au bon endroit. Si vous pouvez préciser svp. Je vous remercie d'avance. pour vérifier le contenu du fichier, tu peux faire "od -c file" ou "od -x file" Ici c pendant la compilation que je dois ecrire ca ? generalement j ecris ca gcc monprog.c -o monprog. Comment je dois m y prendre avec votre ligne de commande ? Encore merci d'avance ^^ Lien vers le commentaire Partager sur d’autres sites More sharing options...
fozzie Posté(e) le 21 août 2005 Partager Posté(e) le 21 août 2005 ton résultat m'aide, je pensais que tu avais le ÿ 2 fois, mais non. ton problème vient probablement de ta fonction parcourir_fichier(); tu affiches les 256 caractères de ta structure, mais tu ne l'as pas initialisée à 0, donc il peut y avoir n'importe quoi dedans, sauf où tu as mis quelque chose. pour l'initialisation, juste après le malloc dans main, tu fais : memset (osef , 0, sizeof(personnes)); explication de strlen() c'est une fonction que tu mets dans ton programme, par exemple dans le main : printf("longueur nom = %d\n", strlen(osef->nom)); la commande "od" : c'est une commande du système, comme more ou cat, quand tu as exécuté ton programme, tu obtiens un fichier "file". cette commande affiche tous les caractères de ton fichier, l'avantage, c'est que tu sais exactement le contenu de ton fichier. od -c file | more : tous les caractères sont affichés avec leur valeur ASCII od -x file | more : tous les caractères sont affichés avec leur valeur hexa Lien vers le commentaire Partager sur d’autres sites More sharing options...
astero-H Posté(e) le 22 août 2005 Partager Posté(e) le 22 août 2005 Le pb c'est peut être ta fonction de parcours du fichier. A mon avis vu que tu fais tout en une ligne ton programme t'affiche également le EOF. Essai ça : void parcourir_fichier(FILE *parcours) { char buf; fread(&buf, sizeof(char), 1, parcours); while( !feof(parcours) ) { printf("%c", buf); fread(&buf, sizeof(char), 1, parcours); } } Je prefere fread car on peut l'utiliser sur tous les types de données (pareil pour l'écriture avec fwrite ). Mais si tu veux garder fgetc : void parcourir_fichier(FILE *parcours) { char buf; buf = fgetc(parcours); while( buf != EOF ) { printf("%c", buf); buf = fgetc(parcours); } } Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 22 août 2005 Auteur Partager Posté(e) le 22 août 2005 Vraiment merci pour vos réponses. J'ai tout essayé. Déjà pour les morceaux de code, le premier avec fread fonctionne parfaitement. Plus de bug. ^^ Ensuite le second avec fgetc, il y'a une petite erreur. parcours.c: Dans la fonction « parcourir_fichier »:parcours.c:99: error: erreur d'analyse syntaxique at end of input Pour la fonction od -c file, j ai essayé avec le programme qiu marche et avec le programme qui marche pas. La valeur ASCII du dernier caractère est différente selon si le programme a le bug ou s'il ne l'a pas. Même si il n'y avait plusde bug, j ai quand même rajouté : memset (osef , 0, sizeof(personnes)); Ca me semble assez important d'initialiser à O. Ca pourrait être source de bug si je ne le fais pas. Par contre je pourrais avoir quelques explications sur les 2 morceaux de code svp. Ca marche c'est un fait ^^' mais je suis pas sûr d'avoir tout compris. Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 22 août 2005 Auteur Partager Posté(e) le 22 août 2005 Ah désolé ça fonctionne aussi avec fgetc. Je sais pas pourquoi mais j'ai refait copier/coller et maintenant plus de bug. :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
astero-H Posté(e) le 22 août 2005 Partager Posté(e) le 22 août 2005 Le probème c'est que tu faisais la lecture du fichier et l'affichage sur la même ligne et ce sans tester le retour de fgetc. Quand fgetc echoue sur sa lecture (fin du fichier) il retourne EOF (End Of File = -1). Avec ton code tu demandais d'afficher EOF. Autre chose, memset est inutile. Pour un char* c'est le caractère spécial '\0' qui délimite la fin de la chaine. Dernier petit conseil : copier / coller c'est pas bien !! Tu devrais enlever toutes ces fonctions ignobles (type_keyb par exemple) et faire quelque chose de plus perso. T'as l'air d'avoir de bonnes bases de prog, donc à ta place je laisserai tomber les tutos et je me mettrais à lire de vrais docs : http://www.cppreference.com/index.html http://www.cplusplus.com/ref/ Lien vers le commentaire Partager sur d’autres sites More sharing options...
bloodhand Posté(e) le 22 août 2005 Auteur Partager Posté(e) le 22 août 2005 mreci pour les explications ^^ En fait la fonction type_keyb, j'avais appris à la faire en cours. Le prof nous avait dit que scanf n'était pas fiable et donc de créer un "taper_clavier" que j'ai ensuite appelé "type_keyb()". Reste à savoir si il avait raison ou pas :) La je ne suis pas assez avancé en langage C pour ça. La mon but était de réutiliser les trucs que j 'avais appris pour la gestion des fichiers. Parcourir le fichier et reafficher à l'écran me semblait pas mal. Je vais faire la copie du contenu d'un fichier vers un autre, d'après ce qu'on m'a dit c'est l'histoire de deux boucles imbriquées. Je verrai bien. Ah oui merci pour le site qui décrit les librairies principales ^^ Ca me ferra gagner du temps pour d'autres programmes. :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
fozzie Posté(e) le 22 août 2005 Partager Posté(e) le 22 août 2005 Autre chose, memset est inutile. Pour un char* c'est le caractère spécial '\0' qui délimite la fin de la chaine. le memset est inutile, sauf dans ce cas, la methode d'affichage du résultat présentée dans le premier post affiche un à un les 256 caractères de la chaine, donc même après le \0. On affiche bien le prénom alors qu'il est après le premier \0. d'ailleurs, c'était la raison de l'affichage du y (l'origine de ce post). certains compilateurs peuvent initialiser les chaines de caractères avec le malloc, mais ce n'est pas portable. Lien vers le commentaire Partager sur d’autres sites More sharing options...
astero-H Posté(e) le 22 août 2005 Partager Posté(e) le 22 août 2005 le memset est inutile, sauf dans ce cas,la methode d'affichage du résultat présentée dans le premier post affiche un à un les 256 caractères de la chaine, donc même après le \0. On affiche bien le prénom alors qu'il est après le premier \0. d'ailleurs, c'était la raison de l'affichage du y (l'origine de ce post). Relis les posts t'as du louper quelque chose Le "y" était dû à une mauvaise utilisation de fgetc et feof, aucun rapport rapport avec le fait de ne pas avoir mis memset... certains compilateurs peuvent initialiser les chaines de caractères avec le malloc, mais ce n'est pas portable. Elle est bien bonne celle là... Lien vers le commentaire Partager sur d’autres sites More sharing options...
fozzie Posté(e) le 22 août 2005 Partager Posté(e) le 22 août 2005 sur ce coup, c'est sûr, j'ai fumé !!! je me marre en me relisant désolé. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.