Inversion lignes de .txt par blocs - C++ - Programmation
Marsh Posté le 15-09-2014 à 14:13:48
Bon, manifestement tu inverses les premiers et derniers tiers du fichier.
En supposant que ton fichier tienne en mémoire (bref qu'il ne soit pas énorme) j'ai pondu un truc vite fait qui te montre l'idée de base (mais ne marche que si les blocs a échanger sont de même taille):
Code :
|
A compiler en C++11 (utilisation du test (!ifs) par exemple).
Note: si tu dois permuter des blocs d'entiers dans ton code, il serait peut être plus simple de faire un std::vector<unsigned int> et de faire du swap_ranges directement dessus.
A+,
Marsh Posté le 16-09-2014 à 10:43:08
Merci pour ta réponse.
L'entreprise chez qui je travaille en ce moment ne dispose pas de c++11, du coup 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é :
Code :
|
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...
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
Marsh Posté le 16-09-2014 à 11:47:41
Bon, il y a pas mal de problèmes avec ton code et j'aimerais comprendre un peu mieux ce que tu veux faire.
Tu as un fichier avec 185 blocs de 220 lignes (et une ou plusieurs lignes d'en-tête?)
Chaque ligne contient 6 entiers longs (écrits sous format lisible, non binaire).
0) Quelle est la taille de ton fichier de départ?
1) une ou plusieurs lignes d'en-tête à ton fichier?
2) quels blocs permutes tu entre eux?
le i-ième bloc avec le (i+1)-ième bloc [blocs successifs]?
le i-ième bloc avec le (220-i)-ième bloc [blocs symmétriques par rapport au milieu du fichier]?
autre?
3) dans le fichier résultat, les 6 entiers longs sont au même format que dans celui de départ (ie lignes inchangées) ou bien sont ils en binaire?
*) tu utilises quel compilo, avec quelle version, parce que de nos jours, en entreprise, ne pas disposer d'un compilo le supportant, euh... (ce serait C++14, je comprendrais, mais la)
Et sinon, mon source précédent n'était pas bien dur à récrire en C++ archaïque:
Code :
|
A+,
Marsh Posté le 16-09-2014 à 12:50:31
Pour ton pb, si on est bien dans le cas d'une inversion de blocs par rapport au milieu du fichier, voici un point de départ (en supposant que ta machine a assez de mémoire pour lire le fichier dans un vector de string, ce qui devrait être je pense le cas).
Code :
|
J'ai testé vite fait sur un fichier de 7 blocs de 3 lignes, et ça marchait sans pb.
A+,
Marsh Posté le 16-09-2014 à 13:04:20
gilou a écrit : Bon, il y a pas mal de problèmes avec ton code et j'aimerais comprendre un peu mieux ce que tu veux faire.
|
0) Mes fichiers font 1.3 Mo environ, 186 blocs de 220 lignes soit 40920 lignes en tout
1) Pas d'en-tête, uniquement des mesures sous formes de 6 doubles par ligne
2) Je ne cherche pas à permuter les blocs par rapport au central mais supposons que j'aie 6 blocs :
1
2
3
4
5
6
Je voudrais que ça devienne
6
5
4
3
2
1
3) Qu'ils soient en binaire serait encore mieux (étant donné que je compte utiliser le nouveau fichier pour le transformer en fichier binaire), mais déjà rien que la permutation serait un gros pas en avant
Merci beaucoup
Marsh Posté le 16-09-2014 à 13:28:27
gilou a écrit : Pour ton pb, si on est bien dans le cas d'une inversion de blocs par rapport au milieu du fichier, voici un point de départ (en supposant que ta machine a assez de mémoire pour lire le fichier dans un vector de string, ce qui devrait être je pense le cas).
|
Tiens, j'ai bien l'impression que ça marche ça ! je fais quelques essais et je vous tiens tout de suite au jus !!
Marsh Posté le 16-09-2014 à 14:39:28
Dans ton cas, il faudrait faire:
const unsigned int blocs_nb = 186;
et ajouter une vérification (a laquelle j'ai pensé après coup)
// on vérifie la cohérence
if (bloc_size * blocs_nb != lines.size() ) {
throw std::logic_error( "Le parametrage par bloc est incoherent avec le nombre de lignes du fichier" );
}
après avoir fait la copie et avant de faire le swap.
A+,
Marsh Posté le 16-09-2014 à 14:42:55
Et tu m'as toujours pas dit quel compilo (et sa version) tu utilisais.
A+,
Marsh Posté le 16-09-2014 à 15:23:22
En tapant g++ -v j'obtiens "gcc version 4.3.2 (Debian 4.3.2-1.1)"
J'ai une dernière petite question !
Les lignes sont de la forme :
12.5 158.3 12.0 15.1 159.2 0.0
Y a-t il moyen de les lire les double séparement (afin de pouvoir les stocker en binaire dans un autre fichier)
lecture façon :
Code :
|
Merci encore !
Marsh Posté le 16-09-2014 à 16:01:30
Ah oui, le compilo date de 6 ans. Pour un truc gratuit comme gcc/g++ c'est un peu bête de ne pas avoir une version a jour, car C++11 corrige et améliore un très grand nombre de chose (le constructeur des fstream qui n'accepte pas les std::string comme argument par exemple, c'est horripilant).
A+,
Marsh Posté le 16-09-2014 à 16:14:39
Bon déjà, sans rentrer dans les histoires de binaires, ce que tu veux faire devrait ressembler à ceci
(pas testé a 100%, mais a 90%, vu que je n'ai ni tes sources ni tes paths sur ma machine).
Code :
|
Toute erreur détectée déclenchera l'arrêt du programme (tu peux coder un autre comportement, fichier de log...)
A+,
Marsh Posté le 16-09-2014 à 18:53:07
Bon, le même modifié pour lire en interne comme des doubles et non du texte, et pour écrire en binaire.
Sans garanties, mais au vu de mes tests, ça devrait être bon.
Code :
|
A+,
Marsh Posté le 12-09-2014 à 16:56:26
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 !