aide recuperation donnees d'un fichier texte - C - Programmation
Marsh Posté le 06-05-2007 à 18:22:05
int c; et non pas char c d'abord.
Ensuite tu as tout à fait raison, c'est à cause de fgetc.
Marsh Posté le 06-05-2007 à 18:51:15
mais sa marche avec char c !!!!
j'ai testé. Je comprend pas.
Sinon ok donc c'est bien à cause de sa.
Comment contourner le problème alors??
Marsh Posté le 07-05-2007 à 01:41:40
Anarchne a écrit : mais sa marche avec char c !!!! |
Si tu veux lire avec fgetc(), c doit être de type int parce que EOF est un int < 0. Avec char, ça fonctionne par hasard. Si il y a un code 255 dans le fichier(ÿ ou un truc comme ça), il est interprété comme une fin de fichier, ce qui n'est probablement pas ce que tu veux.
Citation : Sinon ok donc c'est bien à cause de sa. |
Ensuite, pourquoi utiliser fgetc() + fscanf() ? fgetc() lit un caractère. Il est donc normal qu'il en manque un quand tu lis avec fscanf(), puis qu'il a déjà été lu...
Il faut donc faite les choses simplement selon les règles :
lire la ligne avec fgets(), puis l'analyser avec sscanf().
en cas de fin de lecture, fgets() retourne NULL.
Code :
|
Marsh Posté le 07-05-2007 à 14:19:15
Ok ok merci beaucoup je vais faire comme sa.
Merci de m'avoir aidé.
Marsh Posté le 10-05-2007 à 10:11:37
OK merci sa marche sauf le test si la ligne est vide ou non.
je fais
while (fgets(tampon,30,fic) != NULL)
{
if (tampon != '\n')
{
sscanf(tampon,%d %s %s ....
}
}
mais il ne veut pas faire le test de ligne.
Marsh Posté le 10-05-2007 à 10:37:54
Anarchne a écrit :
mais il ne veut pas faire le test de ligne. |
Oui, c'est sûr. Tu compares l'adresse d'une chaine avec un caractère, tu espères quoi au juste :
Code :
|
Il faut un minimum de bon sens et de cohérence, non ?
Pourquoi tu mets 30 et pas sizeof tampon ? J'ai pas dit que c'était faux, mais je veux juste savoir si il y a une bonne raison.
Marsh Posté le 11-05-2007 à 18:26:29
Ok j'ai compris c'est bon.
if ((*tampon) != '\n')
{
sscanf(tampon,%d %s %s ....
}
et là sa marche.
Marsh Posté le 11-05-2007 à 18:35:55
Anarchne a écrit : Ok j'ai compris c'est bon.
|
Oui, enfin, la différence entre *tampon et tampon[0] est ... faible !
Marsh Posté le 11-05-2007 à 19:18:32
J'ai une autre question, basé sur ce principe, j'aimerais faire une fonction de comptage de lignes non vides.
Le probème est que le programme me renvoie toujours 0.
Voici le programme:
int nb_lignes(FILE *fic)
{
int n=0;
char tampon[50];
while(fgets(tampon,sizeof(tampon),fic) != NULL)
{
if ((*tampon) != '\n')
{
n++;
}
}
return n;
}
Cela devrait marcher non?
Marsh Posté le 11-05-2007 à 19:39:50
Anarchne a écrit : J'ai une autre question, basé sur ce principe, j'aimerais faire une fonction de comptage de lignes non vides. |
Ca devrait. Je vérifie...
C'est OK :
Code :
|
|
Je soupçonne que tu ais déjà atteint la fin de fichier. Il manquerait un rewind() avant d'appeler la fonction de comptage...
Marsh Posté le 11-05-2007 à 20:48:23
rewind je n'ai pas vu cette commande en tp elle fait quoi exactement?
Et qu'est-ce que tu entends par j'ai atteint la fin de fichier???
Marsh Posté le 11-05-2007 à 21:43:32
Anarchne a écrit : rewind je n'ai pas vu cette commande en tp elle fait quoi exactement? Et qu'est-ce que tu entends par j'ai atteint la fin de fichier??? |
Ouvre ton livre de C. Tout ceci est basique...
K&R2 : Chapitre 7
P.S. Il n'y a pas de 'commandes' en C. Uniquement des instructions et des appels de fonction.
Marsh Posté le 25-05-2007 à 15:52:51
salut, ben moi je suis aussi en galère pour récupérer des données ^^
alors en gros, j'ai un fichier asci comprenant une ligne de paramètre puis un tableau d'une 40aine de colonne pour environ 17 000 lignes.
pour le moment, je compte uniquement faire une espèce de copié/collé du fichier que j'essayerais de complexifier ensuite. A terme, il faudra que je crée 3 fichiers (appelons les x, y et z) à partir du premier en récupérant dans chacun la ligne de paramètre puis pour le fichier x les colonnes n, n+3, n+6 etc, pour le fichier y les colonnes n+1, n+4, n+7 etc, et vous avez compris pour le fichier z ^^
j'y connais rien en C alors pour faire ce copié collé, j'ai simplifier pour le moment les données avec un fichier contenant le tableau suivant (les espaces sont des tabulations):
1 a 2
b 3 c
Code :
|
avec ce programme, mon fichier de sortie récupère tout, mais il met tout ça sur une seule colonne:
1
a
2
b
3
c
Ma question est: comment dois je faire pour repositionner les données dans le bonne ordre?
merci d'avance
Marsh Posté le 25-05-2007 à 16:01:04
[Pirater le topic d'un autre, çaÿ mal...]
Biroute a écrit : j'y connais rien en C alors pour faire ce copié collé, j'ai simplifier pour le moment les données avec un fichier contenant le tableau suivant (les espaces sont des tabulations): |
Elles sont dans le bon ordre. Simplement, il y a des \n en trop dans l'affichage qui font que les données ne sont pas présentées pareil.
afficher une ligne :
Code :
|
autant de fois qi'il y a d'éléments dans la ligne.
Quand la ligne est terminée :
Code :
|
simple algorithme basique...
Marsh Posté le 25-05-2007 à 16:08:24
[je squatte parceque je pense que c'est pas loin d'être le même problème que le mien]
oui mais justement, je ne veux pas copier une ligne, je veux copier les éléments séparemment et pouvoir les réordonner ensuite sous forme de tableau. A terme, sur le tableau
1 a 2
b 3 c
je voudrais par exemple récupérer les données de la 1ere colonne et de la dernière pour obtenir le tableau
1 2
b c
ou n'importe quelle autre distribution.
edit: en fait, je suppose que je ne connais pas la taille du tableau, c'est pour ça que je cherche quelque chose en rapport avec les tabulations pour détecter la fin de la ligne par exemple
Marsh Posté le 25-05-2007 à 16:18:33
Biroute a écrit : [je squatte parceque je pense que c'est pas loin d'être le même problème que le mien] |
Ben non. Erreur. Nouvelle question, nouveau sujet. C'est aussi simple que ça. Tu devrais relire les règles du forum...
Citation : oui mais justement, je ne veux pas copier une ligne, je veux copier les éléments séparemment et pouvoir les réordonner ensuite sous forme de tableau. A terme, sur le tableau 1 a 2 je voudrais par exemple récupérer les données de la 1ere colonne et de la dernière pour obtenir le tableau 1 2 ou n'importe quelle autre distribution. |
Bah, il faut écrire le bon algo, c'est tout. C'est de la programmation de base. Si tu ne sais pas programmer, apprends ou fait autre chose...
Marsh Posté le 25-05-2007 à 16:22:06
ok, merci quand même. (j'ai commencé à apprendre la semaine dernière, c'est pour mon stage, donc j'apprends tout seul)
Marsh Posté le 25-05-2007 à 16:28:33
Biroute a écrit : ok, merci quand même. (j'ai commencé à apprendre la semaine dernière, c'est pour mon stage, donc j'apprends tout seul) |
Gné ? Tu apprends le C à l'arrache pour un stage ?
Marsh Posté le 25-05-2007 à 16:32:28
oui, je compte pas faire un truc immense avec, juste trier des données. ensuite bon, je suis un physicien dans un labo de géologie, d'où mon inexpérience dans le domaine ^^
Marsh Posté le 25-05-2007 à 16:43:07
Biroute a écrit : oui, je compte pas faire un truc immense avec, juste trier des données. ensuite bon, je suis un physicien dans un labo de géologie, d'où mon inexpérience dans le domaine ^^ |
Comme je te l'ai dit, le C n'est pas un langage de débutant en programmation. Trop de pièges, trop laxiste (il demande une extrême rigueur et un haut niveau de maitrise de la part du programmeur pour réaliser un programme industriel sûr et fiable). Et ça n'a rien à voir avec la taille. En une ligne, on peut exploser le système.
Est-tu obligé de faire ça en C ?
As-tu envisagé Python ?
Marsh Posté le 25-05-2007 à 16:49:15
je ne connais pas du tout python, et je le fais en C car je connais un peu de visual basic et bon, c pour ça que j'ai déjà compris quelques trucs en une semaine.
c'est quoi python?
Marsh Posté le 25-05-2007 à 17:36:11
Biroute a écrit : je ne connais pas du tout python, et je le fais en C car je connais un peu de visual basic et bon, c pour ça que j'ai déjà compris quelques trucs en une semaine. |
Un langage plus accessible que le C. Mais si connais VB, pourquoi ne pas le faire en VB ?
Marsh Posté le 25-05-2007 à 17:41:11
parceque je trouve beaucoup plus d'information sur le C que sur le VB, et puis je suis pas non plus une lumière en VB, j'ai appris en stage ça aussi
Marsh Posté le 25-05-2007 à 18:42:04
Biroute a écrit : parceque je trouve beaucoup plus d'information sur le C que sur le VB, et puis je suis pas non plus une lumière en VB, j'ai appris en stage ça aussi |
Alors va pour le C. Tu as un livre, un tutoriel, des cours ?
Marsh Posté le 25-05-2007 à 19:15:20
Anarchne a écrit : rewind je n'ai pas vu cette commande en tp elle fait quoi exactement? |
=> man rewind
Anarchne a écrit : Et qu'est-ce que tu entends par j'ai atteint la fin de fichier??? |
Faut essayer d'imaginer un fichier comme un ruban contenant des octets, et ton "FILE *" comme un index sur le fichier.
Chaque fonction de lecture (fgetc, fgets, fscanf, fread) lit le ou les caractères situé sous l'index puis fait avancer l'index d'autant.
Donc deux fgetc d'affilée te lisent 2 octets et ton index est sur le 3°.
Une fois que t'as lu tout le fichier, l'index est à la fin et tu peux plus le lire.
Solutions:
Par exemple, aujourd'hui j'ai fait une fonction qui va chercher une info particulière dans un fichier. Ma fonction devant rendre le pointeur du fichier dans l'état initial, voici ce que j'ai fait
1) récupération de la position de l'index avec ftell()
2) positionner l'index là où se trouve l'info avec fseek()
3) lire l'info
4) remettre l'index dans sa position initiale avec fssek()
Tuto de C ici http://fr.lang.free.fr/cours/Langa [...] e_v2.0.pdf (pour programmation en environnement type Unix)
Marsh Posté le 25-05-2007 à 19:20:59
Emmanuel Delahaye a écrit : Comme je te l'ai dit, le C n'est pas un langage de débutant en programmation. Trop de pièges, trop laxiste (il demande une extrême rigueur et un haut niveau de maitrise de la part du programmeur pour réaliser un programme industriel sûr et fiable). Et ça n'a rien à voir avec la taille. En une ligne, on peut exploser le système. |
je plussoie, le C c'est d'la merde je pige rien
Marsh Posté le 06-05-2007 à 16:43:51
Salut, j'ai un petit problème concernant mon programme de recuperation de donnees:
il doit récupérer une donnée chaine de caractère et deux données entier:
int main()
{
char tampon[30];
int x;
int y;
char c;
FILE *fic;
fic=fopen("fichier.txt","r" );
while(EOF != (c = fgetc(fic)))
{
if ('\n' != c )
{
fscanf(fic,"%s %d %d",tampon,&x,&y);
printf("%s %d %d\n",tampon,x,y);
}
}
system("pause" );
return 0;
}
mon seul problème est qu'il ne récupère pas le premier caractère de ma chaine de texte (se doit être à cause de mon test si la ligne est vide ou non).
exemple
voici mon fichier.txt:
poisson 1 5
chat 24 10
chien 78 5
le programme m'affiche:
oisson 1 5
hat 24 10
hien 78 5
je ne sais pas du tout comment résoudre cela.
Merci de votre aide.