Bonjour,
J'aimerais connaître une méthode pour inverser des blocs d'un fichier txt
par exemple :
6
1
1
2
2
3
5
4
4
deviendrait :
5
4
4
2
2
3
6
1
1
Merci d'avance !
Bonjour,
J'aimerais connaître une méthode pour inverser des blocs d'un fichier txt
par exemple :
6
1
1
2
2
3
5
4
4
deviendrait :
5
4
4
2
2
3
6
1
1
Merci d'avance !
Cela dépend de ce que tu appelles "bloc"
Si les blocs sont des valeurs (nombres, au moins 1 caractère au plus 1 ligne, ...) ou des objets sérialisés alors une solution c'est de lire ton fichier en écrivant ces valeurs dans un tableau/ map/ dictionnaire... (1)
Ensuite, après traitement sur ton (1) tu réécris ton fichier (ou un autre)
Si ce sont vraiment des blocs, comme des paragraphes soit:
- Il faut trouver chaque bloc, l’écrire dans un nouveau fichier et surtout le supprimer (du fichier ou d'une copie)
- Si cela est possible, tu peux lire ton fichier et mémoriser des positions courantes dans le fichier. Et avec des fseek découper ton fichier. Mais faire attention aux suppressions (si il y en a) qui vont invalidées tes positions
Merci pour ta réponse.
Je m'explique. Ce sont des fichiers de 40920 lignes ce qui fait 185 blocs de 220 lignes, chaque ligne formée de 6 doubles espacés d'un espace chacun. J'ai essayé de coder l'ensemble de façon bête et méchante. J'arrive à isoler le dernier bloc, mais quand il s'agit de reparcourir le texte pour récupérer l'avant dernier ça ne marche pas, du coup je me retrouve avec des fichiers textes avec uniquement le dernier bloc...
ci dessous le code commenté :
Je tourne en rond dessus depuis un bon petit moment, j'aimerais juste savoir ce qui empêche de reparcourir le fichier pour prendre un nouveau bloc...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98 #include <iostream> #include <fstream> #include <string> #include <stdlib.h> #include <stdio.h> #include <sstream> using namespace std; int main() { ifstream liste("/home/modis/Desktop/Traitement/liste_fichiers_txt.txt", ios::in);//ouverture de la liste de fichiers if(liste) { string lisligne; string filename0, filename1; string ligne,of_ligne; int n_ligne=40701, i=0,j; double double1, double2, double3, double4, double5, double6; string s1,s2,s3,s4,s5,s6; for(j=0;j<185;j++) //185 blocs { while(getline(liste, lisligne)) { liste >> filename0; //lecture du nom du fichier à ouvrir dans un fichier texte avec l'ensemble des noms filename1 = "/home/modis/Desktop/Traitement/fichiers_invers/" + filename0; filename0 = "/home/modis/Desktop/Traitement/données_modèles/données_modèles/2011/" + filename0; ifstream fichier0(filename0.c_str(), ios::in); ofstream fichier1(filename1.c_str(), ios::out | ios::binary); if(fichier0 && fichier1) { while(getline(fichier0, ligne)) { ostringstream oss1,oss2,oss3,oss4,oss5,oss6; if(i==n_ligne-2-220*j) //220 lignes par bloc { fichier0 >> double1 >> double2 >> double3 >> double4 >> double5 >> double6; oss1 << double1; oss2 << double2; oss3 << double3; oss4 << double4; oss5 << double5; oss6<<double6; s1 = oss1.str(); s2 = oss2.str(); s3 = oss3.str(); s4 = oss4.str(); s5 = oss5.str(); s6 = oss6.str(); of_ligne= s1 + " " + s2 + " " + s3 + " " + s4 + " " + s5 + " " + s6 + "\n"; fichier1 << of_ligne;//ecriture de la ligne dans le fichier output //vide les ostringstream oss1.str(""); oss2.str(""); oss3.str(""); oss4.str(""); oss5.str(""); oss6.str(""); } else i++;//si je ne suis toujours pas à la ligne voulue } } else cerr<<"Impossible d'ouvrir le fichier!1"<<endl; i=0;//remise à zero pour reparcourir le fichier } } } else cerr<<"Impossible d'ouvrir le fichier!2"<<endl; return 0; }
Le but étant d'ouvrir un fichier, de parcourir ses lignes jusqu'à la premiere du bloc voulu, d'écrire ces lignes dans un nouveau fichier. Une fois arrivé à la dernière ligne, on reparcourt le fichier jusqu'à la premiere ligne du bloc au dessus puis on écris la suite etc.
Merci d'avance
Ton code est mauvais
À quoi te sert ta boucle for et ton premier while?
Et donc tu t'en rends compte que tu essayes d'ouvrir tes fichiers à chaque bloc
D'autant que getline "stops if the end of file is reached in is or if some other error occurs during the input operation."
Et aucunement sur une ligne vide.
Et enfin lorsqu'on arrive à la fin d'un fichier, pour repartir au débit il faut faire un fseek(pFile , 0 , SEEK_SET); (ou un truc de ce style)
getline
fseek
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager