Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2268 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Gestion des données d'un fichier TXT

 


 Mot :   Pseudo :  
 
 Page :   1  2
Page Précédente
Auteur Sujet :

Gestion des données d'un fichier TXT

n°1261004
Profil sup​primé
Posté le 07-12-2005 à 15:10:08  answer
 

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.

mood
Publicité
Posté le 07-12-2005 à 15:10:08  profilanswer
 

n°1261039
flo850
moi je
Posté le 07-12-2005 à 15:28:41  profilanswer
 

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


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

n°1261044
Profil sup​primé
Posté le 07-12-2005 à 15:31:31  answer
 

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

n°1261057
Elmoricq
Modérateur
Posté le 07-12-2005 à 15:37:21  profilanswer
 


 [: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
n°1261076
Profil sup​primé
Posté le 07-12-2005 à 15:46:19  answer
 

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?

n°1261080
Profil sup​primé
Posté le 07-12-2005 à 15:46:40  answer
 

oups, avais pas tout lu dsl...

n°1261119
Profil sup​primé
Posté le 07-12-2005 à 16:21:39  answer
 

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?

n°1261122
Elmoricq
Modérateur
Posté le 07-12-2005 à 16:22:42  profilanswer
 


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

n°1261130
Profil sup​primé
Posté le 07-12-2005 à 16:31:28  answer
 

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

n°1261143
Elmoricq
Modérateur
Posté le 07-12-2005 à 16:37:24  profilanswer
 


 
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...

mood
Publicité
Posté le 07-12-2005 à 16:37:24  profilanswer
 

n°1261146
Sve@r
Posté le 07-12-2005 à 16:42:01  profilanswer
 

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.
n°1261149
Elmoricq
Modérateur
Posté le 07-12-2005 à 16:44:51  profilanswer
 

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
n°1261155
Profil sup​primé
Posté le 07-12-2005 à 16:49:41  answer
 

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

n°1261157
Elmoricq
Modérateur
Posté le 07-12-2005 à 16:51:18  profilanswer
 

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
n°1261586
Profil sup​primé
Posté le 08-12-2005 à 11:43:33  answer
 

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

n°1261592
Elmoricq
Modérateur
Posté le 08-12-2005 à 11:54:32  profilanswer
 
n°1261643
Sve@r
Posté le 08-12-2005 à 13:14:44  profilanswer
 


 
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.
n°1261648
Elmoricq
Modérateur
Posté le 08-12-2005 à 13:18:44  profilanswer
 

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

n°1261791
Profil sup​primé
Posté le 08-12-2005 à 15:08:00  answer
 

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

n°1261797
Elmoricq
Modérateur
Posté le 08-12-2005 à 15:10:55  profilanswer
 

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

n°1261799
Profil sup​primé
Posté le 08-12-2005 à 15:12:16  answer
 

comment convertir ue string en char unique?

n°1261807
Elmoricq
Modérateur
Posté le 08-12-2005 à 15:21:59  profilanswer
 


 
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.

n°1261810
Profil sup​primé
Posté le 08-12-2005 à 15:23:32  answer
 

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

n°1261812
Elmoricq
Modérateur
Posté le 08-12-2005 à 15:24:30  profilanswer
 

:??:
 
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
n°1261814
Profil sup​primé
Posté le 08-12-2005 à 15:25:04  answer
 

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

n°1261818
Profil sup​primé
Posté le 08-12-2005 à 15:26:03  answer
 

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"...

n°1261851
Elmoricq
Modérateur
Posté le 08-12-2005 à 15:50:13  profilanswer
 


 
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;
}

n°1261868
Sve@r
Posté le 08-12-2005 à 15:58:36  profilanswer
 


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.
n°1261895
Profil sup​primé
Posté le 08-12-2005 à 16:22:03  answer
 

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.

n°1261915
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-12-2005 à 16:46:57  profilanswer
 


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/
n°1261917
Profil sup​primé
Posté le 08-12-2005 à 16:49:49  answer
 

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

n°1261924
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-12-2005 à 17:01:49  profilanswer
 


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/
n°1261930
Profil sup​primé
Posté le 08-12-2005 à 17:08:41  answer
 

Merci

n°1262327
Profil sup​primé
Posté le 09-12-2005 à 09:33:58  answer
 
n°1262339
Elmoricq
Modérateur
Posté le 09-12-2005 à 09:54:25  profilanswer
 


 [:pingouino]

n°1262364
Profil sup​primé
Posté le 09-12-2005 à 10:28:08  answer
 

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

n°1262368
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-12-2005 à 10:31:25  profilanswer
 


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/
n°1262369
Elmoricq
Modérateur
Posté le 09-12-2005 à 10:31:32  profilanswer
 

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

n°1262373
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-12-2005 à 10:32:43  profilanswer
 

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/
n°1262379
Elmoricq
Modérateur
Posté le 09-12-2005 à 10:38:38  profilanswer
 

[:j l b]
 
 
EDIT :  


Je viens de comprendre :lol:

Message cité 1 fois
Message édité par Elmoricq le 09-12-2005 à 10:39:45
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2
Page Précédente

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Gestion des données d'un fichier TXT

 

Sujets relatifs
supprimer un fichier sous unixscript tranférer dans un fichier
[c++] DLL fichier de logslire et écrire à partir d'un fichier
Récupérer les infos d'un fichier txt en batchBase de données gratuite pour soft commercial?
Bibliothèques de gestion de graphes (liste d'adjacence)fichier HEX
base de données des codes barresLecture d'un fichier texte en boucle C++
Plus de sujets relatifs à : Gestion des données d'un fichier TXT


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR