Erreur dans un programme - C - Programmation
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).
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.
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). |
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.
je sais qu'il est difficile de reprendre le code de quelqu'un d'autre et je vous remercie pour cet éffort
Marsh Posté le 25-08-2009 à 19:08:56
Ok, si j'ai bien compris, tu espères en écrivant ça :
Code :
|
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);".
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...
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.
bon je part débugger ou trouver une autre solution, je vous tiens au courant.
merci tpierron pour ton aide.
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
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 :
|
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+,
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 :
bon ça c'est fait
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.
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.