Aide sur traitement du fichier - C - Programmation
Marsh Posté le 17-07-2009 à 12:49:53
Pour le curseur montre nous ce qui ne va pas. Car là ta question est vague.
Pour supprimer des colonnes à mon avis il n'y a pas de fonction toute faite étant donné qu'on travaille ligne par ligne.
En revanche pour supprimer les lignes tu peux réécrire seulement les lignes qui t'intéressent en zappant les autres.
Marsh Posté le 17-07-2009 à 14:39:03
Salut,
- Après la suppression d'une ligne qui contient la chaine "000000", il reste une ligne vide.
Comment j'évite cette ligne vide ?
- Pour la suppression d'une colonne:
lorsque je trouve un 0 en position k dans la chaine de première ligne.
comment je vais déplacer en position k dans la chaine de celui de reste des lignes c-à-d ligne 2, 3 jusqu'à la dernière ligne ?
car on doit supprimer la colonne de la chaine qui est 0 dans toutes les chaines
Merci.
Marsh Posté le 17-07-2009 à 14:46:48
Ca fait longtemps que je n'ai pas fait de C mais moi comme j'ai dit je réécrirais dans un autre fichier (quitte à remplacer l'ancien avec à la fin) ça serait plus simple. Et en lisant ligne par ligne il est facile de savoir le numéro de la colonne dans chaque ligne.
Marsh Posté le 17-07-2009 à 14:54:21
il vaut largement mieux que tu lises entièrement ton fichier, que tu travailles ensuite en mémoire (suppression des lignes et colonnes selon tes critères) et une fois que tu as terminé, tu écris ton fichier (que ce soit par-dessus l'ancien ou non importe peu)
Marsh Posté le 17-07-2009 à 21:06:57
msedirim a écrit : Salut, |
Ca ressemble fort au topic décrit ici: http://forum.hardware.fr/hfr/Progr [...] 4114_1.htm. En tout cas la réponse reste la même...
msedirim a écrit : J'ai trouvé des difficultés à manipuler les positions du curseur dans un fichier de plus je ne sais pas si il y a des fonctions prédéfinis dans C qui permettent du supprimer des lignes et des colonnes selon un critère. |
Non. La suppression en informatique ça n'existe pas. Un fichier contient des octets et après manipulation il contient toujours des octets (parfois moins, parfois plus).
Si tu vois un fichier comme ceci
Code :
|
C'est qu'il contient ceci
Code :
|
Et c'est ton programme de visualisation (notepad) qui remplace les "\n" par de beaux sauts de ligne. Partant de là, si tu veux enlever les deux "l" de "Hello" ben la seule solution est de tout réécrire. Tu peux réécrire tout le fichier ou seulement à partir des "l" mais en tout cas il te faut quand-même lire et réécrire toute la fin. Ca peut se faire dans le même fichier (ouvert en "r+" ) ou alors dans un autre qui viendra remplacer le fichier d'origine.
msedirim a écrit :
|
Et voilà. T'as beau créer de nouveaux topics, si le problème ne change pas la solution ne change pas non plus...
Marsh Posté le 17-07-2009 à 23:54:03
Effectivement, topic en doublon : http://forum.hardware.fr/hfr/Progr [...] 4114_1.htm
La réponse a de plus été donnée dans le précédent sujet.
Enfin, étant donné la forme du premier post, j'ai la vague impression que tu souhaites que quelqu'un réalise le travail à ta place.
Tout ceci commence à faire beaucoup.
Marsh Posté le 18-07-2009 à 09:03:24
Salut,
Je reformule ma demande.
J'ai un fichier texte bien formé contient deux champs: objet et attribut. Tous les objets sont des entiers et tous les attributs sont de chaines de caractères de même taille.
chaque ligne contient un objet et son attribut par exemple:
essai.txt:
10 1110001
20 1010100
30 0100101
37 0000000
40 1000101
50 0000000
80 1110001
100 1010001
1) je voudrais supprimer les lignes qui contiennent une chaine qui est toute à 0 par exemple dans notre on a "0000000"
Donc, on doit supprimer les lignes suivantes:
37 0000000
50 0000000
2) Je voudrais supprimer les 0 de même position dans chaque chaine de caractère. J'appelle ceci la suppression des colonnes.
Par exemple dans notre cas, nous allons supprimer les 0 dans la position 4 et 6 de chaque chaine car dans cette position nous avons toutes les chaines ont un 0 dans la position 4 et 6.
j'ai trouvé une difficulté de résoudre ce problème, de plus imaginez si nous avons un fichier volumineux (donc c'est couteux d'utiliser une autre structure en mémoire pour faire des traitements nécessaires).
Mon idée:
1) Pour la suppression des lignes: je parcoure ligne par ligne et je vérifie c'est la chaine de cette ligne est égale au "0000000" alors je supprime cette ligne.
Comment je vais supprimer cette ligne ? Et après la suppression, est ce qu'il reste une ligne vide(comme une entrée) ? Si oui, comment je éviter cette ligne vide
2) Pour la suppression des colonnes: Je parcoure seulement la première ligne de fichier. Pour tout 0 de chaine de première ligne je teste si je trouve dans position p un 0 dans la chaine du première ligne alors je vérifie si je trouve 0 dans la même position p dans les chaines des autres lignes.
Cette solution este théorique. Imaginez si nous avons un fichier volumineux.De plus, comment je vais déplacer dans le fichier dans la bonne position ?
A la fin, je ne dois pas obtenir un résultat comme çà :
10 11101
20 10110
30 01011
40 10011
80 11101
100 10101
Mais, Le résultat voulu est( dans le même fichier ou autre fichier) :
essai.txt:
10 11101
20 10110
30 01011
40 10011
80 11101
100 10101
S'il vous plait, j'ai besoin de vos aides.
Merci.
Marsh Posté le 18-07-2009 à 10:21:58
Il. Faut. Réécrire. Intégralement. Le. Fichier.
On n'arrête pas de te le répéter : tu ne peux pas modifier un fichier sans le réécrire.
Quant à la problématique de mémoire : tes fichiers sont volumineux ? Seront volumineux un jour ? Tu as des limitations ?
Marsh Posté le 18-07-2009 à 22:51:09
msedirim a écrit : 1) Pour la suppression des lignes: je parcoure ligne par ligne et je vérifie c'est la chaine de cette ligne est égale au "0000000" alors je supprime cette ligne. |
Tu ne fais vraiment pas d'effort pour comprendre !!!
- tu ouvres ton fichier en lecture et tu en ouvres un second en écriture
- tu lis le premier ligne à ligne, ça c'est ok
- si la ligne n'est pas à "00000000" alors tu l'écris dans le second fichier
Une fois le traitement fini, tu supprimes le fichier de départ et tu renommes le second
Ou bien, autre méthode plus délicate
1 - tu ouvres ton fichier en lecture/écriture
2 - tu définis un indice de position de lecture et un d'écriture - tu les mets tous les deux à 0
3 - tu lis ta ligne - tu décales ton indice de lecture du nb de caractères lus
4 - si cette ligne n'est pas à "000000", alors tu te positionnes sur la position correspondant à ton indice d'écriture (fseek) et tu écris la ligne et tu décales cet indice du nombre de caractères écrits et enfin tu te repositionnes (fseek again) sur la position correspondant à l'indice de lecture
5 - tu retournes en 3 pour lire la ligne suivante et ce jusqu'à la fin
6 - une fois tout le fichier traité, tu finis avec un ftruncate() pour supprimer les octets qui sont en trop (concrètement ceux situés entre la dernière position écrite et la dernière lue, elle-même correspondant à la taille initiale du fichier) et tu fais un fclose() et c'est fini
Ca marche aussi. Et ça peut être optimisé pour ne commencer à n'écrire qu'à partir du moment où il y a décalage (moment où tu trouves ta première ligne à "000000" ). Toutefois je ne suis pas certain que ftruncate() sois standard (à vérifier).
msedirim a écrit : 2) Pour la suppression des colonnes: Je parcoure seulement la première ligne de fichier. Pour tout 0 de chaine de première ligne je teste si je trouve dans position p un 0 dans la chaine du première ligne alors je vérifie si je trouve 0 dans la même position p dans les chaines des autres lignes. |
Tu as fseek() qui te permet de te placer sur la position de ton choix. Mais effectivement, tu as tout à fait raison, ton algo implique la mémorisation complète du fichier => il devrait plaire à pat333
Je re réexplique le mien
1 - tu définis un tableau de int tab[n], n correspondant au nombre de caractères de chaque ligne (sous-entendu toutes les lignes ont la même taille). Tableau initialisé tout à zéro
2 - tu ouvres ton fichier et tu mémorises la première ligne
3 - tu instancies ensuite une boucle de lecture (qui commencera donc à la seconde ligne évidemment)
4 - tu compares chaque caractère de la ligne lue avec chaque caractère de la première ligne (tu te souviens qu'elle a été mémorisée ???). S'ils sont différents, tu mets alors tab[x] à un (ou deux ou dix-huit ou ce que tu veux sauf zéro), x étant la position du caractère testé
5 - tu retournes en 3 tant qu'il y a des lignes à lire
6 - A partir d'ici, tout le fichier a été lu - Ton tableau "tab" contient les positions des caractères identiques pour toutes les lignes (c'est les tab[x] restés à zéro)
Donc de là,
- soit tu ouvres un second fichier et tu recopies le premier dans le second ligne à ligne en sautant les caractères identifiés comme identiques (c'est ceux dont le tab[x] est à zéro)
- soit tu réécris le fichier sur lui-même en utilisant le système des indices de lecture et d'écriture (comme expliqué plus haut) et en sautant, lors de l'écriture, les caractères identifiés comme identiques (si on se vautre pas avec les compteurs, ça fonctionne)
Dans les 2 cas, il te faut te repositionner au début du fichier que tu vas relire (fseek again => ça fait trois fois que je nomme cette fonction => peut-être qu'elle est importante et qu'il sera utile d'ouvrir une doc quelconque qui explique ce qu'elle fait mais bon, on n'est pas dans ta tête...)
msedirim a écrit : S'il vous plait, j'ai besoin de vos aides. |
Encore faudrait-il que tu lises et réfléchisses à celles qu'on t'a déjà donné...
Marsh Posté le 19-07-2009 à 00:02:30
Salut,
- J'ai résolu la partie de suppression des lignes. Mais, elle me reste la partie du suppression des colonnes.
donnée:
Chaque ligne du fichier texte contient deux champs: un objet présenté par un entier et un attribut présenté par une chaine de caractère.
Le fichier est bien formé puisque il est rempli de manière suivante:
fprintf("%10d%s",objet,attribut);
- Pour la suppression des colonnes, j'ai trouvé une difficulté à programmer mon idée suivante:
Je positionne sur le premier caractère de chaine de caractère (deuxième champ) du première ligne du fichier. Je teste caractère par caractère si égale à 0, par exemple si on trouve 0 à la position k du la chaine du caractère alors je dois positionner sur la même position k du la chaine du caractère de deuxième ligne alors je teste si ce caractère égale à 0 alors je dois positionner sur la même position k du la chaine du caractère de troisième ligne jusqu'à la fin du fichier. Dans le cas que si n'est pas égale à 0 alors j'arrête ce n'est pas la peine de continuer de voir les autres lignes restantes mais je dois retourner seulement à la position k +1 du chaine du première ligne pour tester si égale à 0 ou non . Si ce n'est pas égale à 0 alors je teste de même manière les caractères restantes jusqu'à la fin du ligne.
Autre optimisation, Si je ne trouve aucun 0 dans la chaine du caractère du première ligne alors c'est inutile de voir les autres lignes donc on s'arrête et on a aucun colonne à supprimer.
Cette idée permet de trouver les positions à supprimer. Mais, je ne sais pas comment je vais les supprimer.
Avez-vous une idée ?
S'il vous plait, j'ai besoin de vos aides pour programmer cette idée et pourquoi pas à améliorer.
Merci.
Marsh Posté le 19-07-2009 à 02:14:49
msedirim a écrit : Mais, je ne sais pas comment je vais les supprimer. Avez-vous une idée ? S'il vous plait, j'ai besoin de vos aides pour programmer cette idée et pourquoi pas à améliorer. |
Non mais c'est une blague ? C'est un troll ? C'est quoi ton délire là ?
T'as pris la peine de lire et comprendre les réponses qu'on te donne ? Va falloir locker le topic si ça continue comme tu ne pourras plus poser la même question à chaque fois et tu seras obligé de faire avec les réponses que Sve@r t'a données.
Marsh Posté le 19-07-2009 à 13:55:25
Deamon a écrit : |
Ouais c'est bon. j'ai fait un appel à modos. Ils vont venir vérifier tout ça...
Marsh Posté le 19-07-2009 à 18:47:23
Il y a un amendement pour ce cas, c'est l'amendement Cracotte78.
Qui s'applique ici.
Topic fermé.
Marsh Posté le 17-07-2009 à 12:40:33
Salut,
J'ai un fichier qui se compose de deux champs :
- numero présenté par un entier
- attribut présenté par une chaine caractère.
On a la même taille pour le champ attribut dans toutes les lignes du fichier.
Par exemple, Soit le fichier nommé essai.txt:
1 110101
2 100101
3 110101
4 000101
5 000000
6 110101
7 110101
8 000000
9 010101
10 100101
Le travail demandé est:
- Supprimer des lignes du fichier essai.txt qui contiennent comme chaine caractere "000000"
Dans notre exemple, on doit supprimer les deux lignes suivantes:
5 000000
8 000000
-Supprimer des colonnes du la chaine attribut pour chaque ligne sachant que cette colonne est tout à 0 dans toutes les chaines du fichier.
Dans notre exemple, on remarque que la colonne 3 et 5 sont toutes à 0.
En conclusion, on obtient le résultat suivant qui présente un fichier (on peut travailler sur le même fichier ou autre)
après la suppression des lignes et des colonnes faite :
1 1111
2 1011
3 1111
4 0011
6 1111
7 1111
9 0111
10 1011
Je dois faire un programme C sous Windows permettant du supprimer des lignes et des colonnes comme décrit précédament.
J'ai trouvé des difficultés à manipuler les positions du curseur dans un fichier de plus je ne sais pas si il y a des
fonctions prédéfinis dans C qui permettent du supprimer des lignes et des colonnes selon un critère.
S'il vous plait,Pouvez-vous m'aider ?
Merci.