Erreur dans un programme

Erreur dans un programme - C - Programmation

Marsh Posté le 25-08-2009 à 16:22:26    

bonjour,
je suis sous winXP,IDE devc++,newbies, et je fait un programme en c.
objectif final: faire un un serveur (je suis au tout tout début).
but de ce code:
j'ai en local un fichier texte "test.txt" remplit du début à la fin par "ABCDEABCDEABC..."
j'ai 5clients qui veulent ecrire chacun dans leur fichier texte attribué (exemple client1 à le fichier "Client1.txt" )
la lettre qui leur correspond.
au final je veut que le fichier "Client1.txt" soit remplit de A
le fichier "Client2.txt" soit remplit de B
le fichier "Client3.txt" soit remplit de C
...
 
bon attention je balance le code et je pose mes question après ;) :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define NombreDeClients  5
  4. #define TailleMaxNomFichier 20
  5. #define CheminFichierMax 94
  6. int main(int argc, char *argv[])
  7. {
  8.     int status,caractereActuel=0,i;
  9.     int* iP1[NombreDeClients];// là je veut faire un tableau de pointeur pour tout les pointeur de fichier
  10.     int* iRemplisseurDeTrame[NombreDeClients];
  11.     FILE* FichierVideo = NULL;
  12.     FILE * FichierClient= NULL;//pointeur de fichier client
  13.     //char CheminFichier[CheminFichierMax];
  14.     char NomDuFichier[TailleMaxNomFichier];
  15.     char cNomFichierClient [11]="Client";//fichier client
  16.     int c;
  17.     //creation fichier client
  18.     for (i = 0 ; i < NombreDeClients ; i++)
  19.     {       
  20.         sprintf(cNomFichierClient,"Client %i.txt", (i+1));// concatenation pour les noms de fichier
  21.         //création du fichier Clienti.txt
  22.         iP1[i] = fopen(cNomFichierClient, "w" );//prototype de fopen definit dans stdio.h
  23.         /* test d'ouverture du fichier (est-elle realisée ?) */
  24.         if (iP1[i] != NULL)
  25.         {
  26.             //printf("test 2a  \n" );
  27.             printf ("  ouverture fichier Client%d          [OK] \n",(i+1));
  28.           }
  29.           else
  30.           {
  31.            printf ("  ouverture fichier Client%d          [FAIL] \n",(i+1));
  32.          
  33.           }
  34.    }//fin boucle for fin de creation des fichiers clients
  35.    printf("\n" );
  36.  
  37.     printf("entrez le nom du fichier a ouvrir\n" );
  38.     scanf ("%s",  &NomDuFichier);//là j'entre  : test.txt
  39.     printf("vous avez saisi %s\n\n",NomDuFichier);
  40.    
  41.     FichierVideo = fopen(NomDuFichier, "r+" );
  42.     if (FichierVideo != NULL)
  43.     {
  44.         // On peut lire et écrire dans le fichier  
  45.         printf("  ouverture fichier %s        [OK]\n",NomDuFichier );
  46.         // début lecture ecriture....
  47.        
  48.         //initialisation de verif de fin de fichier
  49.         caractereActuel = fgetc(FichierVideo+NombreDeClients-1);
  50.         while (caractereActuel != EOF);//tant qu'on est pas a fin du fichier
  51.         {
  52.                  for (i = 0 ; i < NombreDeClients ; i++)
  53.                  {
  54.                    
  55.                      //fputc('A', FichierVideo);// test d'ecriture dans le fichier marche
  56.                      FichierClient=FichierVideo+i;
  57.                      //printf("\nvaleur de la case pointer par FichierClient %i\n",*FichierClient);
  58.                      c=  (*FichierClient);
  59.                    
  60.                      fputc(c, iP1[i]);
  61.                    
  62.                  }
  63.                  caractereActuel = fgetc(FichierVideo+NombreDeClients-1); // On lit le caractère
  64.                  if (caractereActuel != EOF)
  65.                  FichierVideo+=5;// parce que j'ai 5 client
  66.                
  67.         }
  68.         printf("\n" );   
  69.        
  70.         //.... On ferme le fichier qui a été ouvert
  71.         status = fclose(FichierVideo);
  72.         if (status == EOF)
  73.            printf("  fermeture fichier %s        [FAILED]\n",NomDuFichier);
  74.         else if (status == 0)
  75.            printf("  fermeture fichier %s        [OK]\n",NomDuFichier);
  76.         else
  77.            printf("  fermeture status lors de la tentative de fermeture  du fichier %s          [FAILED]\n",NomDuFichier);   
  78.     }
  79.     else
  80.         printf("  ouverture fichier %s         [FAILED]\n", NomDuFichier); // On affiche un message d'erreur
  81.    
  82.   system("PAUSE" );
  83.   return 0;
  84. }


 
bon ça c'est fait :)  :ange:  
 
j'obtiens 1 warning à : iP1[i] = fopen(cNomFichierClient, "w" );
"[Warning] assignment from incompatible pointer type" mais si il n'y a que le warning ça compile et ça fonctionne. C'est mon tableau de pointeur qui ne doit pas ce faire comme ça je pense. :/
 
une erreur, dans la boucle for à la ligne: c=  (*FichierClient);
" incompatible types in assignment "
là je souhaite mettre dans la variable c, la valeur de la case mémoire pointée par le pointeur FichierClient.
 
et enfin un warning à la ligne:fputc(c, iP1[i]);
"[Warning] passing arg 2 of `fputc' from incompatible pointer type "
là encore je pense que ça vient de mon tableau de pointeur.
 
mais bon le résultat est que je n'arrive pas a compiler, et ne trouve pas comment résoudre ces erreur.
je ne comprend pas pourquoi ça passe pas. :sarcastic:  
 
donc si quelqu'un pourrait , m'aider à comprendre, m'expliquer ou/et m'aider à débuguer, je lui en serais reconnaissant. :)
 


---------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Reply

Marsh Posté le 25-08-2009 à 16:22:26   

Reply

Marsh Posté le 25-08-2009 à 18:20:31    

Bon, tu manipules tes fichiers avec stdio, donc le type pour manipuler le fichier c'est "FILE *" (l'étoile est importante dans la mesure où c'est un type incomplet, le compilo va forcément raler sans).
 
Donc oublie le type "int", ça c'est pour les appels systèmes (open, write, close, les noms se ressemblent mais ils ne fonctionnent pas de la même manière).
 
 :sweat: pour les lignes 55 à 73. C'est n'importe quoi, il y a tellement d'erreurs, que je mettrais tout à la poubelle, si j'étais toi. Je n'ai même pas compris ce que tu voulais faire.

Message cité 1 fois
Message édité par tpierron le 25-08-2009 à 18:20:53
Reply

Marsh Posté le 25-08-2009 à 18:44:47    

tpierron a écrit :

Bon, tu manipules tes fichiers avec stdio, donc le type pour manipuler le fichier c'est "FILE *" (l'étoile est importante dans la mesure où c'est un type incomplet, le compilo va forcément raler sans).
 
Donc oublie le type "int", ça c'est pour les appels systèmes (open, write, close, les noms se ressemblent mais ils ne fonctionnent pas de la même manière).
 
 :sweat: pour les lignes 55 à 73. C'est n'importe quoi, il y a tellement d'erreurs, que je mettrais tout à la poubelle, si j'étais toi. Je n'ai même pas compris ce que tu voulais faire.


 
 
héhé :)
merci de ta réponse.
donc pour mon tableau de pointeur je devrais faire un :
FILE* iP1[NombreDeClients];
au lieu de  
int* iP1[NombreDeClients];
?! et ça serait correct?  :??:  
 
pour les ligne 55 à 73 je les explique :
j'ai un pointeur sur un fichier à lire
le pointeur c'est FichierVideo et le fichier pointé à lire c'est mon "test.txt"
je rappelle que dans ce fichier se trouve écrit  "ABCDEABCDE..."  
quand on ouvre "test.txt" le pointeur FichierVideo pointe donc sur A.
j'enregistre le A, soit la valeur pointé par FichierVideo c'est à dire *FichierVideo dans le fichier "Client1.txt" au moyen du pointeur iP1[0] qui pointe sur ce fichier.
si je veux enregistrer le B dans "client2.txt" je récupère donc la valeur pointé par FichierVideo+1 (puisque c'est la valeur d'après.
si je veux enregistrer le C dans "client3.txt" je récupère donc la valeur pointé par FichierVideo+2
si je veux enregistrer le D dans "client4.txt" je récupère donc la valeur pointé par FichierVideo+3
si je veux enregistrer le E dans "client5.txt" je récupère donc la valeur pointé par FichierVideo+4
 
donc c'est à ça que servait mon for
ensuite pour pointer sur le prochain A (ou la prochaine serie "ABCDE" si tu prefères)
je déplace le pointeur FichierVideo de quatre case.
 
 
et je fait cela jusqu'a avoir traité tout le fichier
(jusqu'a la fin du fichier)
d'où le while.
 
 
si tu veux je te détail ligne par ligne entre la 55 et la 73 ce que j'ai voulu faire.
 
je ne sais pas si j'ai été assez clair.  :sarcastic:  
je sais qu'il est difficile de reprendre le code de quelqu'un d'autre et je vous remercie pour cet éffort :)


---------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Reply

Marsh Posté le 25-08-2009 à 19:08:56    


Ok, si j'ai bien compris, tu espères en écrivant ça :

Code :
  1. FichierClient=FichierVideo+i;
  2. //printf("\nvaleur de la case pointer par FichierClient %i\n",*FichierClient);
  3. c=  (*FichierClient);


Que ça va te récupérer le ième caractère à partir de la position courrante dans le fichier "FichierVideo" ? Si c'est ça, bah, euh, tu as de sérieuse lacune sur la gestion des fichiers en C. Tu pourrais utiliser fseek(), mais dans la mesure où tu lis séquentiellement ton fichier, contente toi de faire des "fgetc(FichierVideo);".

Reply

Marsh Posté le 26-08-2009 à 09:42:53    


 
ben je ne vois pas où est mon erreur quand même.  
 
FichierClient et FichierVideo sont deux pointeur de fichier, donc ils sont de même type donc je ne mélange déjà pas des choux et des carottes.  
FichierVideo pointe sur un endroit de mon fichier (une case mémoire):  
mettons qu'il pointe sur 0x01a0, je veut aller voir la prochaine case  
je fais donc +1.  
dans mon idée je pense etre maintenant à 0x01a1.  
pour le :  
c = *FichierClient;  
ce que je veut faire c'est récupérer la donnée contenue à cette adresse (0x01a1).  
je viens de regarder fgets, c'est vrai que ça pourait me correspondre.  
ce que je veut c'est au final remplacer le fichier texte sur lequel je me forme, par un film, et donc d'avoir sur un film, un pointeur principale qui "lit" le film à un temps 0 et des client qui choisissent de regarder le film "en live", ou de revenir dans le temps.  
donc d'avoir sur ce fichier un pointeur de lecture principale, et plusieur pointeur pour le client, qui ce balade dans tout le fichier, mais référés par rapport à ce pointeur de lecture principal.  
sinon bien sur que j'ai quelques lacune (même dans le c en général) c'était sous entendu par le terme "newbies" (je ne commence que depuis quelque jour).  
mais théoriquement "c'est en faisant des erreur que l'on apprend".  
si quelqu'un à des propositions à me faire, des explication sur le fait que ça ne fonctionne pas...


Message édité par ProGrammeHeure le 26-08-2009 à 09:44:12
Reply

Marsh Posté le 26-08-2009 à 09:44:00    

ok j'ai remplacé
int* iP1[NombreDeClients]= { }; par FILE* iP1[NombreDeClients]= { };
et donc je n'ai plus les deux warning :)  
ensuite j'ai remplacé
c=  (*FichierClient);  par     c = fgetc(FichierClient);  
donc tout compile parfaitement et je n'ai pas d'erreur.
déjà ça c'est fait!  :)  
mais le programme ne fait pas ce que je veux  :(  et n'inscrit pas les caractère récupéré par c dans les fichier client (exemple "client1.txt" devrai etre remplit de A, mais ce n'est pas le cas il est vide)
est ce que ça viendrai du fait que je ne ferme pas le fichier? je ne pense pas, de plus le programme ne passe qu'une fois dans la boucle for qui est dans la boucle while. :sarcastic:  
 
bon je part débugger ou trouver une autre solution, je vous tiens au courant.
merci tpierron pour ton aide.


---------------
De tous ceux qui n'ont rien à dire, les plus agréables sont ceux qui se taisent.
Reply

Marsh Posté le 26-08-2009 à 10:13:25    

bon tous mes fichier recupère bien chacun leur lettre, c'est bon.
mais il n'en recupère qu'une, :/
j'y retourne :)

Reply

Marsh Posté le 26-08-2009 à 11:31:21    

Citation :

FichierClient et FichierVideo sont deux pointeur de fichier

Ce sont des pointeurs sur une structure FILE, un descripteur de fichier, structure qui contient plein d'infos utilisée par le système, et non des pointeurs sur le contenu du fichier vu comme une suite de caractères, comme tu sembles le croire.
Un exemple de structure FILE sur RS6000 (ca va être OS dépendant)

Code :
  1. typedef struct {
  2. unsigned char *_ptr;
  3. int _cnt;
  4. unsigned char *_base;
  5. unsigned char *_bufendp;
  6. short _flag;
  7. short _file;
  8. int __stdioid;
  9. char *__newbase;
  10. long _unused[1];
  11. } FILE;


Quand tu programmes en C, tu n'accèdes pas a cette structure directement (sauf si tu fait de la programmation au niveau du noyau et même la c'est pas si courant...). Par contre, les fonctions comme fgetc ou autres vont y accéder, et faire le travail à ta place, afin de te permettre de travailler de manière indépendante de la définition de FILE sur ton système.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 26-08-2009 à 12:02:03    

gilou et la lumière fut :)
merci beaucoup

Reply

Marsh Posté le 26-08-2009 à 17:31:48    

resolu! :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed