Aide sur traitement du fichier

Aide sur traitement du fichier - C - Programmation

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.

Reply

Marsh Posté le 17-07-2009 à 12:40:33   

Reply

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.

Reply

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.

Reply

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.


Message édité par Deamon le 17-07-2009 à 14:47:25
Reply

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)


---------------
last.fm
Reply

Marsh Posté le 17-07-2009 à 21:06:57    

msedirim a écrit :

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.


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 :
  1. Hello
  2. World


C'est qu'il contient ceci

Code :
  1. Hello\nWorld\n


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 :

theshockwave a écrit :

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)



Et voilà. T'as beau créer de nouveaux topics, si le problème ne change pas la solution ne change pas non plus...


Message édité par Sve@r le 17-07-2009 à 21:07:46

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

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.


Message édité par Elmoricq le 17-07-2009 à 23:54:12
Reply

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.
 

Reply

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 ?


Message édité par Elmoricq le 18-07-2009 à 10:22:37
Reply

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


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


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


Message édité par Sve@r le 18-07-2009 à 23:03:34

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

Marsh Posté le 18-07-2009 à 22:51:09   

Reply

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.

Reply

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.

Message cité 1 fois
Message édité par Deamon le 19-07-2009 à 02:16:17
Reply

Marsh Posté le 19-07-2009 à 13:55:25    

Deamon a écrit :


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.


 
Ouais c'est bon. j'ai fait un appel à modos. Ils vont venir vérifier tout ça...


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

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

Reply

Sujets relatifs:

Leave a Replay

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