Supprimer derniere ligne d'un fichier SANS le parcourir - C - Programmation
Marsh Posté le 27-08-2016 à 14:13:00
Si tu sais que ta dernière ligne n’excède pas une certaine longueur K, tu peux te positionner a K octets de la fin, copier les K derniers octets de ton fichier dans un buffer, y calculer la position du dernier \n et en déduire à quelle longueur tu dois tronquer ton fichier.
Ça suppose néanmoins que fseek positionné par rapport à la fin ne parcourt pas tous le fichier pour y aller, ce qui peut ne pas être le cas si ton implem de fseek n'est pas optimisée.
A+,
Marsh Posté le 27-08-2016 à 14:36:30
Merci pour votre réponse
Je viens de faire le code en C et ca fonctionne nikel. J'en ai profité pour récupérer la dernière ligne avant de la supprimer ^^
Marsh Posté le 27-08-2016 à 14:52:27
Faut faire juste gaffe au cas limite du fichier de taille < K
Comme de toute façon tu connais la taille du fichier, c'est pas couteux de tester.
A+,
Marsh Posté le 27-08-2016 à 15:55:06
Bon... Ben en faite, je ne sais pas pourquoi mais j'ai une erreur ( 0x0000005) avec mon code . Le printf("Debug\n" ); indique le dernier moment avant le bug. Le printf("Debug\n" ); indique celui qui ne s'affiche pas. Donc visiblement l'erreur arrive au niveau ma boucle "do...While"...
Je répète que je ne connais pas la taille de mon fichier, ni son nombre de lignes, ni la taille de la dernière ligne ^^
voici mon code :
Code :
|
Je ne comprends pas comment je peux avoir une erreur d'accès mémoire... J'ai testé avec "while...do" et while(last_line[i-1] != '\0'); ou while(last_line[i+1] != '\0'); et c'est exactement pareil, mon printf("%d\n",i); écrit 0, puis ca plante...
Qqun a-t'il une solution ? Je comprends pas la
Merci pour votre aide
Marsh Posté le 27-08-2016 à 17:47:18
Tu l'ouvres comment ton fichier? Sous Windows en tout cas je dois mettre fopen(..., "rb" ). Après il y a des +1/-1 en trop/inutiles. Par contre si le fichier est trop court --> BOUM. Un peu de gestion d'erreur (fseek, fread, strrchr) ne serait pas une mauvaise idée.
Code sur demande.
Marsh Posté le 27-08-2016 à 22:50:09
Effectivement, en ouvrant le fichier en "rb+" c'est mieux
J'ai fini par y arriver en utilisant une méthode un peu "dégeux" ^^, mais c'est toujours mieux que de parcourir encore et encore tout un fichier de plusieurs dizaines de Go
Voici mon code ( qui fonctionne bien, en tous cas j'ai pas encore eu d'erreur et je l'ai testé sur plusieurs fichiers de plusieurs formats et différentes tailles ) :
Code :
|
Voila, au final ce programme fait a peu prés ce que je voulais, cad : Lire la dernière ligne, et la supprimer (la faire disparaître visuellement) . Bien sur, si je pouvais tout simplement supprimer la dernière ligne ce serait mieux, mais bon, c'est déjà bien comme ca.
Bonne soirée a tous
Marsh Posté le 12-09-2016 à 01:33:00
Tu pourrais utiliser un buffer correspondant a la taille de ton fichier, et récupérer l'avant dernier \n et delete tout entre le \n et la fin de ton buffer
Marsh Posté le 12-09-2016 à 10:25:55
suiL a écrit : Tu pourrais utiliser un buffer correspondant a la taille de ton fichier, et récupérer l'avant dernier \n et delete tout entre le \n et la fin de ton buffer |
Si le fichier fait plusieurs dizaines de Go c'est pas trop une option. Sur plateforme 64b tu peux mmapper le fichier par contre, c'est à ça que ça sert. Et tu voudras dans tous les cas appliquer le même processus d'itérer les caractères en partant de la fin histoire de pas te taper 10Go de truc dont tu te fous, donc ça va pas faire une grosse différence.
Si les lignes sont très très longues tu peux charger tes données dans un petit buffer (16 octets) pour pouvoir vectoriser la recherche, mais bon c'est beaucoup de complexité pour probablement pas grand chose.
Marsh Posté le 19-10-2016 à 23:25:39
xfreekingx a écrit : Bien sur, si je pouvais tout simplement supprimer la dernière ligne ce serait mieux, mais bon, c'est déjà bien comme ca. |
Quel compilateur? Avec MinGW on peut utiliser ftruncate() mais c'est pas dans la lib standard C.
Le code suivant est juste un "proof of concept" sans garantie, à tester/améliorer/adapter/...
Code :
|
(Oui j'aime bien le code aéré. )
Mais euh... Ce genre de truc sur un pdf???
Citation :
|
Marsh Posté le 27-08-2016 à 12:28:10
Bonjour tout le monde ,
Je recherche une solution afin de pouvoir supprimer la dernière ligne d'un fichier (.txt ou autre) en C. Le problème est que je ne connais par avance, ni la taille du fichier, ni la longueur de la dernière ligne... Le fichier pouvant faire plusieurs Go, il est hors de question de parcourir chaque lignes jusqu’à la dernière...
Du coup je m’étais dis que je pourrais peut-être me placer directement à la fin du fichier (avec fseek() ) puis remonter jusqu'au dernier '\n' et écraser tout ce qui suit avec des " " ( du style : fprinf(monFichier," " ); ). C'est un peu "sale" mais bon...
Comment puis-me placer au début de la dernière ligne ?
Connaissez-vous une façon moins "sale" de supprimer la dernière ligne sans parcourir tout le fichier ?
Merci pour votre aide