Gestion des données d'un fichier TXT - C - Programmation
Marsh Posté le 07-12-2005 à 15:28:41
regarde du cote de fopen pour ouvriri le fichier et de fscanf pour le lire
Marsh Posté le 07-12-2005 à 15:31:31
oui, et après, mon probleme est pour couper la chaine obtenue...
Marsh Posté le 07-12-2005 à 15:37:21
flo850 a écrit : fscanf |
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)
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?
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?
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.
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???
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...
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. |
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);
...
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.
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...
Marsh Posté le 07-12-2005 à 16:49:41
la fonction fseek me permet de trouver une ligne, n'est ce pas?
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 )
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
Marsh Posté le 08-12-2005 à 11:54:32
http://forum.hardware.fr/hardwaref [...] m#t1261122
ou
http://forum.hardware.fr/hardwaref [...] m#t1261146
Marsh Posté le 08-12-2005 à 13:14:44
Elmoricq a écrit : http://forum.hardware.fr/hardwaref [...] m#t1261122 |
Tiens... un post récursif
Marsh Posté le 08-12-2005 à 15:12:16
ReplyMarsh 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.
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...
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 ?
Marsh Posté le 08-12-2005 à 15:26:03
Elmoricq a écrit : |
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"...
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> |
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:
Et tu obtiens en plus la variable "mot" qui contient l'adresse de début de la chaîne
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')
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.
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.
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?
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
Marsh Posté le 09-12-2005 à 10:28:08
ReplyMarsh 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().
Marsh Posté le 09-12-2005 à 10:31:32
ReplyMarsh 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
Marsh Posté le 09-12-2005 à 10:38:38
EDIT :
Emmanuel Delahaye a écrit : d[-7-]b |
Je viens de comprendre
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.