Gestion des données d'un fichier TXT

Gestion des données d'un fichier TXT - C - Programmation

Marsh Posté le 07-12-2005 à 15:10:08    

Salut
J'ai un prog C qui ecrit dans un fichier des infos.
Demande le nom, le prénom, le tel et le mail et les range comme suit dans un fichier texte :
UNTEL Fred 00.00.00.00.00 fred.untel@forum.hardware.fr
Je voudrais lire toutes les infos de ce fichier et les traiter indépendamment.
Par exemple, je vioudrais extraire la ligne 10 (chaque ligne est une personne differente), puis séparer le nom, le prenom, le tel et le mail pour les re-rentrer dans des variables...
comment faire... ???
Merci de votre aide.

Reply

Marsh Posté le 07-12-2005 à 15:10:08   

Reply

Marsh Posté le 07-12-2005 à 15:28:41    

regarde du cote de fopen pour ouvriri le fichier et de fscanf pour le lire


---------------

Reply

Marsh Posté le 07-12-2005 à 15:31:31    

oui, et après, mon probleme est pour couper la chaine obtenue...

Reply

Marsh Posté le 07-12-2005 à 15:37:21    


 [:ban]  
 
 
Voir toutes les fonctions de gestion de fichiers de stdio.h : fopen (ouverture), fclose (fermeture), fgets/fputs/fwrite/fread/fprintf (fonctions de lecture/écriture), ...
 
"man le_nom_de_la_fonction" en ligne de commande sous un Unix quelconque te fournira toute l'aide nécessaire.
Si tu n'es pas sous un unixoïde, tape la même chose mais dans google, ça marche aussi :)
 
 
Pour l'interprétation de la chaîne, tu as les fonctions de string.h : strchr, strstr, strlen, ...
Dans ton cas, regarde du côté de strtok() (attention, son utilisation n'est pas triviale)


Message édité par Elmoricq le 07-12-2005 à 15:38:13
Reply

Marsh Posté le 07-12-2005 à 15:46:19    

Et le manipulation des chaines???
Par exemple j'ai récupéré les lignes de mon txt avec sprintf(), et maintenant je veux récupérer le numéro, le nom, le prénom, le tel, et lemail...
Comment faire?

Reply

Marsh Posté le 07-12-2005 à 15:46:40    

oups, avais pas tout lu dsl...

Reply

Marsh Posté le 07-12-2005 à 16:21:39    

J'ai testé strtok et ca marche pour ce que je voulais faire... MERCI Elmoricq.
Cependant, me reste cette question : Comment effacer une ligne d'un fichier texte?

Reply

Marsh Posté le 07-12-2005 à 16:22:42    


 
Il faut réécrire le fichier en entier dans un fichier temporaire, sans la ligne.  
Et remplacer le fichier initial par le nouveau fichier.

Reply

Marsh Posté le 07-12-2005 à 16:31:28    

On ne peut pas tout simplement comme on rajoute une ligne avec fprintf() en effacer une???

Reply

Marsh Posté le 07-12-2005 à 16:37:24    


 
Quand tu ajoutes une ligne, c'est en fin de fichier. Pour ajouter au milieu ou au début, même combat : il faut réécrire le fichier.
 
Enfin... tu pourrais éventuellement bidouiller pour modifier le fichier à la volée. Ce n'est pas impossible, mais très risqué ; un fichier, c'est juste un bloc de données stocké sur un support non volatile.  
Et un nombre varié de facteurs peuvent faire rater tes modifications.  
Si tu travailles sur un nouveau fichier, aucun problème, il te suffit de recommencer : ton fichier initial est resté inchangé jusqu'à son remplacement.
Si tu travailles directement sur ton fichier de données, un crash au mauvais moment et tu peux dire adieu à tes précieuses données.
 
Imagine ce que ça peut donner sur des fichiers importants...

Reply

Marsh Posté le 07-12-2005 à 16:37:24   

Reply

Marsh Posté le 07-12-2005 à 16:42:01    

Elmoricq a écrit :

Il faut réécrire le fichier en entier dans un fichier temporaire, sans la ligne.  
Et remplacer le fichier initial par le nouveau fichier.


 
Ou bien alors tu construits ton fichier initial avec tes infos utiles plus un champ supplémentaire que tu remplis avec une valeur indiquant si la ligne est valide ou pas (par exemple tu peux y mettre le caractère 'd' pour 'deleted').
Et dans ton algo, tu sautes les lignes dont le champ en question contient le caractère 'd'
Tu veux effacer une ligne, tu te positionnes sur le champ de la ligne en question (fseek) et tu écris 'd'  => fputc('d', fp);
Tu veux "déseffacer" une ligne, tu te positionnes sur le champ de la ligne en question (fseek) et tu écris autre chose que 'd' => fputc(' ', fp);
...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 07-12-2005 à 16:44:51    

Oui, c'est ce qu'il y a de mieux à faire sur les gros fichiers d'enregistrements, ça va beaucoup plus vite.
 
Avec une purge de temps en temps pour enlever définitivement les enregistrements marqués comme effacés.
 
:jap:
 
J'ai bossé sur une appli qui utilisait une base de données version fichiers plats et qui faisait comme ça.
Tiens, je me demande comment les SGBD modernes font...


Message édité par Elmoricq le 07-12-2005 à 16:46:31
Reply

Marsh Posté le 07-12-2005 à 16:49:41    

la fonction fseek me permet de trouver une ligne, n'est ce pas?

Reply

Marsh Posté le 07-12-2005 à 16:51:18    

fseek() te permet de te positionner à un endroit précis (offset) du fichier.
 
Il n'y a pas de notion de ligne, sachant qu'une "ligne" ce ne sont que des données séparées par un séparateur de fin de ligne.
Ce séparateur est d'ailleurs différent selon les systèmes (ex : Unix = \n , Windows = \r\n )


Message édité par Elmoricq le 07-12-2005 à 16:52:30
Reply

Marsh Posté le 08-12-2005 à 11:43:33    

Dans mon cas, cahaque personne est représentée sur une ligne.
Avec la fonction fgets(), je lis toutes les lignes, et le pointeur qui est sur la ligne me renvoie le nom de la personne.
Comment puis-je faire pour effecer une seule ligne, en fonction du numéro de la personne???
Mzerci

Reply

Marsh Posté le 08-12-2005 à 13:14:44    


 
Tiens... un post récursif :D [:rofl] :D


Message édité par Sve@r le 08-12-2005 à 13:24:44

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-12-2005 à 13:18:44    

Et y a pas de condition d'arrêt... on va péter la pile ! [:totoz]

Reply

Marsh Posté le 08-12-2005 à 15:08:00    

Je ne réussis pas à faire ce que vous dites...

Reply

Marsh Posté le 08-12-2005 à 15:10:55    

Montre-nous le morceau de code qui te pose problème.

Reply

Marsh Posté le 08-12-2005 à 15:12:16    

comment convertir ue string en char unique?

Reply

Marsh Posté le 08-12-2005 à 15:21:59    


 
Euh. En ne prenant que le caractère qui t'intéresse dans la chaîne ?
 
Parce qu'en fait de conversion, c'est un peu comme si tu demandais de "convertir" un nombre en chiffre.
Ca n'a pas de sens.

Reply

Marsh Posté le 08-12-2005 à 15:23:32    

Si parce que par exemple la methode switch ne marche qu'avec un char unique alors que pas avec une chaine...

Reply

Marsh Posté le 08-12-2005 à 15:24:30    

:??:
 
Je ne comprends pas. Nous sommes d'accord qu'en C, une "chaîne" c'est un ensemble de caractères ?

Message cité 1 fois
Message édité par Elmoricq le 08-12-2005 à 15:25:00
Reply

Marsh Posté le 08-12-2005 à 15:25:04    

Il me dit : Cannot convert 'char[2]' to 'char'

Reply

Marsh Posté le 08-12-2005 à 15:26:03    

Elmoricq a écrit :

:??:
 
Je ne comprends pas. Nous sommes d'accord qu'en C, une "chaîne" c'est un ensemble de caractères ?


 
Oui mais le C fait une différence entre un caractère noté 'a' et une chaine ne contenant qu'un caractère, notée "a"...

Reply

Marsh Posté le 08-12-2005 à 15:50:13    


 
Ah, alors soyons précis : tu ne souhaites pas "convertir une chaîne en un caractère", tu veux "extraire un caractère d'une chaîne".
 
Ce qui est tout à fait différent.
 
Exemple :

#include <stdio.h>
 
int main(void)
{
    const char *hello = "hello";
 
    printf("Premier caractère de %s : %c\n", hello, hello[0]);
     
    return 0;
}

Reply

Marsh Posté le 08-12-2005 à 15:58:36    


Commençons pas reposer les bases: En C, la notion de "chaîne de caractère" n'existe pas en tant qu'élément de base (comme le char, int, long, etc).
Afin de pouvoir utiliser les chaînes, les programmeurs ont adopté la convention qu'une chaîne serait une suite de caractères contigüs en mémoire. Mais pour faire la différence entre une chaine et une suite quelconque de caractères, la chaine possède en plus un caractère de valeur '\0' (appelé "valeur sentinelle" ).
Donc, si tu écris "char mot[]="Hello", tu déclares un tableau de 6 caractères suivants:

  • mot[0]='H'
  • mot[1]='e'
  • mot[2]='l'
  • mot[3]='l'
  • mot[4]='o'
  • mot[5]='\0'


Et tu obtiens en plus la variable "mot" qui contient l'adresse de début de la chaîne

  • mot = &mot[0]


Le programmeur qui veut manipuler une chaîne (comparer, afficher, copier) doit partir de l'adresse de début (donc de "mot" ) et la traiter caractère par caractère jusqu'à ce qu'il trouve le caractère '\0'. Heureusement une majorité de fonctions ont été déjà codées dans la librairie standard (strlen, strcmp, strcpy) donc tu n'as plus qu'à les utiliser.
 
Conclusion: Tu peux pas faire un "switch()... case" sur la variable "mot" car cette variable ne contient que l'adresse "&mot[0]"
 
Maintenant rien ne t'empêche de manipuler "mot[0]" et/ou "mot[1]" ... car ce sont des caractères comme les autres.
 
 
 
Ben oui... parce que ta chaîne "a" contient deux caractères ('a' et '\0')


Message édité par Sve@r le 08-12-2005 à 16:10:29

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 08-12-2005 à 16:22:03    

Je vous remercie.
C'était juste un pb de [0].
Vous m'avez été d'une aide précieuse.
Je suis vraiment désolé mais des fois on réfléchit pendant des heures alors que la solution est juste devant notre nez.
Merci encore.
 
Sinon, vous allez dire que je vous embête, mais si je veux maintenant ajouter en fin de ligne la chaine " o", comment dois-je m'y prendre, car la description de la fonction fseek() m'est un peu délicate à lire et en anglais dans mon logiciel.
Merci encore.

Reply

Marsh Posté le 08-12-2005 à 16:46:57    


surtout que fseek() n'a rien à voir avec le chaines.... Pour ajouter une chaine à une chaine, on utilise strcat() ou strncat(). Il faut évidemment que le tableau de char de destination soit suffisament grand...
 
Quand à l'anglais, je te conseille de t'y mettre rapidement, au moins en lecture. C'est indispensable dans ce métier.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-12-2005 à 16:49:49    

Oui mais pour récupérer la chaine à la fin de laquelle je souhaite rajouter la chaine " o", comment faire?

Reply

Marsh Posté le 08-12-2005 à 17:01:49    


Si tu dois lire un fichier texte : fgets(). Attention, il y a des précautions d'usage...
 
http://mapage.noos.fr/emdel/notes.htm#saisie
http://mapage.noos.fr/emdel/notes.htm#fichiers


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-12-2005 à 17:08:41    

Merci

Reply

Marsh Posté le 09-12-2005 à 09:33:58    

Reply

Marsh Posté le 09-12-2005 à 09:54:25    


 [:pingouino]

Reply

Marsh Posté le 09-12-2005 à 10:28:08    

Comment savoir à quel endroit je dois placer mon pointeur avec fseek?

Reply

Marsh Posté le 09-12-2005 à 10:31:25    


Tu lis les lignes avec fgets(), tu les compte quand tu es à la ligne qui t'interesse, tu la traite. Pas besoin de fseek().


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-12-2005 à 10:31:32    

C'est à toi de compter et de savoir où le placer.

Reply

Marsh Posté le 09-12-2005 à 10:32:43    

Elmoricq a écrit :

C'est à toi de compter et de savoir où le placer.


7 secondes dans ta face !
 
d[-7-]b

Message cité 1 fois
Message édité par Emmanuel Delahaye le 09-12-2005 à 10:34:21

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-12-2005 à 10:38:38    

[:j l b]
 
 
EDIT :  


Je viens de comprendre :lol:

Message cité 1 fois
Message édité par Elmoricq le 09-12-2005 à 10:39:45
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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