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