Aller au contenu

Problèmes pour un prog en C ! Help please


bloodhand

Messages recommandés

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

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

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

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

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

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

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

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 :love:). 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

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

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

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

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

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 :eeek2:

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.

:roll: Elle est bien bonne celle là...

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...