Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1406 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Inversion lignes de .txt par blocs

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Inversion lignes de .txt par blocs

n°2237899
rattlesnak​e
Posté le 12-09-2014 à 16:56:26  profilanswer
 

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 !

mood
Publicité
Posté le 12-09-2014 à 16:56:26  profilanswer
 

n°2238000
gilou
Modérateur
Modzilla
Posté le 15-09-2014 à 14:13:48  profilanswer
 

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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <system_error>
  7. int main()
  8. {
  9.     std::string filename = "data.txt";
  10.     try {
  11.         // on ouvre le fichier
  12.         std::ifstream ifs( filename );
  13.         if (!ifs) {
  14.             throw std::system_error( ENOENT, std::system_category(), filename );
  15.         }
  16.         // on lit son contenu dans un vecteur
  17.         std::vector<std::string> lines;
  18.         lines.reserve(256); // pas de réallocation si moins de 256 lines
  19.         for (std::string line; std::getline( ifs, line ); /* */) {
  20.             lines.push_back( line );
  21.         }
  22.         // on calcule la taille des blocs de début et fin faisant 1/3 des lignes
  23.         unsigned int bloc_size = lines.size()/3;
  24.         // on échange les blocs dans le vecteur
  25.         std::swap_ranges( lines.begin(), lines.begin() + bloc_size, lines.end() - bloc_size );
  26.         // On affiche le résultat
  27.         for ( auto it = lines.begin(); it != lines.end(); ++it ) {
  28.             std::cout << *it << std::endl;
  29.         }
  30.     } catch ( const std::exception & e ) {
  31.         std::cerr << "Error : " << e.what() << "." << std::endl;
  32.     }
  33.     return 0;
  34. }


 
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+,


Message édité par gilou le 15-09-2014 à 14:24:17

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238031
rattlesnak​e
Posté le 16-09-2014 à 10:43:08  profilanswer
 

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 :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <sstream>
  7. using namespace std;
  8. int main()
  9. {
  10. ifstream liste("/home/modis/Desktop/Traitement/liste_fichiers_txt.txt", ios::in);//ouverture de la liste de fichiers
  11. if(liste)
  12. {
  13.  string lisligne;
  14.  string filename0, filename1;
  15.  string ligne,of_ligne;
  16.  int n_ligne=40701, i=0,j;
  17.  double double1, double2, double3, double4, double5, double6;
  18.  string s1,s2,s3,s4,s5,s6;
  19. for(j=0;j<185;j++) //185 blocs
  20.   {
  21.  while(getline(liste, lisligne))
  22.  {
  23.    liste >> filename0; //lecture du nom du fichier à ouvrir dans un fichier texte avec l'ensemble des noms
  24.    filename1 = "/home/modis/Desktop/Traitement/fichiers_invers/" + filename0;
  25.    filename0 = "/home/modis/Desktop/Traitement/données_modèles/données_modèles/2011/" + filename0;
  26.    ifstream fichier0(filename0.c_str(), ios::in);
  27.    ofstream fichier1(filename1.c_str(), ios::out | ios::binary);
  28.    if(fichier0 && fichier1)
  29.     {
  30.      while(getline(fichier0, ligne))
  31.      {
  32.          ostringstream oss1,oss2,oss3,oss4,oss5,oss6;
  33.         if(i==n_ligne-2-220*j) //220 lignes par bloc
  34.         {
  35.          fichier0 >> double1 >> double2 >> double3 >> double4 >> double5 >> double6;
  36.          oss1 << double1;
  37.          oss2 << double2;
  38.          oss3 << double3;
  39.          oss4 << double4;
  40.          oss5 << double5; oss6<<double6;
  41.          s1 = oss1.str();
  42.          s2 = oss2.str();
  43.          s3 = oss3.str();
  44.          s4 = oss4.str();
  45.          s5 = oss5.str();
  46.          s6 = oss6.str();
  47.          of_ligne= s1 + " " + s2 + " " + s3 + " " + s4 + " " + s5 + " " + s6 + "\n";
  48.          fichier1 << of_ligne;//ecriture de la ligne dans le fichier output
  49.          //vide les ostringstream        
  50.          oss1.str("" );
  51.          oss2.str("" );
  52.          oss3.str("" );
  53.          oss4.str("" );
  54.          oss5.str("" );
  55.          oss6.str("" );
  56.         }
  57.         else i++;//si je ne suis toujours pas à la ligne voulue
  58.      }
  59.     }
  60.     else
  61.      cerr<<"Impossible d'ouvrir le fichier!1"<<endl;
  62.     i=0;//remise à zero pour reparcourir le fichier
  63.  }
  64. }
  65. }
  66. else
  67.  cerr<<"Impossible d'ouvrir le fichier!2"<<endl;
  68. return 0;
  69. }


 
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


Message édité par rattlesnake le 16-09-2014 à 10:52:06
n°2238036
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 11:47:41  profilanswer
 

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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <stdexcept> // <system_error> seulement en C++11
  7. int main()
  8. {
  9.     const std::string filename("blocs.txt" );
  10.     try {
  11.         // on ouvre le fichier
  12.         std::ifstream ifs( filename.c_str() );  // argument du constructeur en string seulement en C++11
  13.         if (ifs.fail()) {  // booleen sur stream seulement en C++11
  14.             throw std::runtime_error( "No such file or directory: " + filename );  // remplacement vu qu'il y a pas de system_error
  15.         }
  16.         // on lit son contenu dans un vecteur
  17.         std::vector<std::string> lines;
  18.         lines.reserve(256); // pas de réallocation si moins de 256 lines
  19.         for (std::string line; std::getline( ifs, line ); /* */) {
  20.             lines.push_back( line );
  21.         }
  22.         // on calcule la taille des blocs de début et fin faisant 1/3 des lignes
  23.         unsigned int bloc_size = lines.size()/3;
  24.         // on échange les blocs dans le vecteur
  25.         std::swap_ranges(lines.begin(), lines.begin() + bloc_size, lines.end() - bloc_size);
  26.         // On affiche le résultat
  27.         for ( std::vector<std::string>::iterator it = lines.begin(); it != lines.end(); ++it ) {  // iterateur a type déduit avec auto seulement en C++11
  28.             std::cout << *it << std::endl;
  29.         }
  30.     } catch ( const std::exception & e ) {
  31.         std::cerr << "Error : " << e.what() << "." << std::endl;
  32.     }
  33.     return 0;
  34. }


A+,

Message cité 1 fois
Message édité par gilou le 16-09-2014 à 12:14:43

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238040
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 12:50:31  profilanswer
 

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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <stdexcept>
  7. int main()
  8. {
  9.     const std::string filename("blocs.txt" );
  10.     const unsigned int bloc_size = 220;
  11.     const unsigned int blocs_nb  = 185;
  12.     try {
  13.         // on ouvre le fichier
  14.         std::ifstream ifs( filename.c_str() );
  15.         if (ifs.fail()) {
  16.             throw std::runtime_error( "No such file or directory: " + filename );
  17.         }
  18.         // on lit son contenu dans un vecteur
  19.         std::vector<std::string> lines;
  20.         lines.reserve(40701);
  21.         for (std::string line; std::getline( ifs, line ); /* */) {
  22.             lines.push_back( line );
  23.         }
  24.         for (unsigned int i = 0; i < (int)(blocs_nb/2); ++i) {
  25.             std::swap_ranges(lines.begin() + (i * bloc_size),
  26.                              lines.begin() + ((i+1) * bloc_size),
  27.                              lines.end()   - ((i+1) * bloc_size));
  28.         }
  29.         // On affiche le résultat
  30.         for ( std::vector<std::string>::iterator it = lines.begin(); it != lines.end(); ++it ) {
  31.             std::cout << *it << std::endl;
  32.         }
  33.     } catch ( const std::exception & e ) {
  34.         std::cerr << "Error : " << e.what() << "." << std::endl;
  35.     }
  36.     return 0;
  37. }


 
J'ai testé vite fait sur un fichier de 7 blocs de 3 lignes, et ça marchait sans pb.
 
A+,

Message cité 1 fois
Message édité par gilou le 16-09-2014 à 12:53:42

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238042
rattlesnak​e
Posté le 16-09-2014 à 13:04:20  profilanswer
 

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.
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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <stdexcept> // <system_error> seulement en C++11
  7. int main()
  8. {
  9.     const std::string filename("blocs.txt" );
  10.     try {
  11.         // on ouvre le fichier
  12.         std::ifstream ifs( filename.c_str() );  // argument du constructeur en string seulement en C++11
  13.         if (ifs.fail()) {  // booleen sur stream seulement en C++11
  14.             throw std::runtime_error( "No such file or directory: " + filename );  // remplacement vu qu'il y a pas de system_error
  15.         }
  16.         // on lit son contenu dans un vecteur
  17.         std::vector<std::string> lines;
  18.         lines.reserve(256); // pas de réallocation si moins de 256 lines
  19.         for (std::string line; std::getline( ifs, line ); /* */) {
  20.             lines.push_back( line );
  21.         }
  22.         // on calcule la taille des blocs de début et fin faisant 1/3 des lignes
  23.         unsigned int bloc_size = lines.size()/3;
  24.         // on échange les blocs dans le vecteur
  25.         std::swap_ranges(lines.begin(), lines.begin() + bloc_size, lines.end() - bloc_size);
  26.         // On affiche le résultat
  27.         for ( std::vector<std::string>::iterator it = lines.begin(); it != lines.end(); ++it ) {  // iterateur a type déduit avec auto seulement en C++11
  28.             std::cout << *it << std::endl;
  29.         }
  30.     } catch ( const std::exception & e ) {
  31.         std::cerr << "Error : " << e.what() << "." << std::endl;
  32.     }
  33.     return 0;
  34. }


A+,


 
 
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

n°2238047
rattlesnak​e
Posté le 16-09-2014 à 13:28:27  profilanswer
 

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

Code :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <stdexcept>
  7. int main()
  8. {
  9.     const std::string filename("blocs.txt" );
  10.     const unsigned int bloc_size = 220;
  11.     const unsigned int blocs_nb  = 185;
  12.     try {
  13.         // on ouvre le fichier
  14.         std::ifstream ifs( filename.c_str() );
  15.         if (ifs.fail()) {
  16.             throw std::runtime_error( "No such file or directory: " + filename );
  17.         }
  18.         // on lit son contenu dans un vecteur
  19.         std::vector<std::string> lines;
  20.         lines.reserve(40701);
  21.         for (std::string line; std::getline( ifs, line ); /* */) {
  22.             lines.push_back( line );
  23.         }
  24.         for (unsigned int i = 0; i < (int)(blocs_nb/2); ++i) {
  25.             std::swap_ranges(lines.begin() + (i * bloc_size),
  26.                              lines.begin() + ((i+1) * bloc_size),
  27.                              lines.end()   - ((i+1) * bloc_size));
  28.         }
  29.         // On affiche le résultat
  30.         for ( std::vector<std::string>::iterator it = lines.begin(); it != lines.end(); ++it ) {
  31.             std::cout << *it << std::endl;
  32.         }
  33.     } catch ( const std::exception & e ) {
  34.         std::cerr << "Error : " << e.what() << "." << std::endl;
  35.     }
  36.     return 0;
  37. }


 
J'ai testé vite fait sur un fichier de 7 blocs de 3 lignes, et ça marchait sans pb.
 
A+,


 
Tiens, j'ai bien l'impression que ça marche ça ! je fais quelques essais et je vous tiens tout de suite au jus !!

n°2238067
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 14:39:28  profilanswer
 

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238069
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 14:42:55  profilanswer
 

Et tu m'as toujours pas dit quel compilo (et sa version) tu utilisais.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238081
rattlesnak​e
Posté le 16-09-2014 à 15:23:22  profilanswer
 

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 :
  1. fichier0 >> double1 >> double2 >> double3 >> double4 >> double5 >> double6;


Merci encore !

mood
Publicité
Posté le 16-09-2014 à 15:23:22  profilanswer
 

n°2238092
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 16:01:30  profilanswer
 

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238093
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 16:14:39  profilanswer
 

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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <stdexcept>
  7. std::vector<std::string> get_files(const std::string& file)
  8. {
  9.     std::ifstream ifs( file.c_str() );
  10.     if (ifs.fail()) {
  11.         throw std::runtime_error( "Echec a l'ouverture du fichier " + file );
  12.     }
  13.     std::vector<std::string> filelist;
  14.     for (std::string line; std::getline( ifs, line ); ) {
  15.         filelist.push_back( line );
  16.     }
  17.     return filelist;
  18. }
  19. void swap_blocs(const std::string& infile, const std::string& outfile, unsigned int blocs_nb, unsigned int bloc_size)
  20. {
  21.     // on ouvre le fichier en entree
  22.     std::ifstream ifs( infile.c_str() );
  23.     if (ifs.fail()) {
  24.         throw std::runtime_error( "No such file or directory: " + infile );
  25.     }
  26.     // on lit son contenu dans un vecteur
  27.     std::vector<std::string> lines;
  28.     lines.reserve(40921);
  29.     for (std::string line; std::getline( ifs, line ); /* */) {
  30.         lines.push_back( line );
  31.     }
  32.     for (unsigned int i = 0; i < (unsigned int)(blocs_nb/2); ++i) {
  33.         std::swap_ranges(lines.begin() + (i * bloc_size),
  34.                          lines.begin() + ((i+1) * bloc_size),
  35.                          lines.end()   - ((i+1) * bloc_size));
  36.     }
  37.     // on ouvre le fichier en sortie
  38.     std::ofstream ofs( outfile.c_str() );
  39.     if (ofs.fail()) {
  40.         throw std::runtime_error( "No such file or directory: " + outfile );
  41.     }
  42.     // on écrit ligne à ligne dedans
  43.     for ( std::vector<std::string>::iterator it = lines.begin(); it != lines.end(); ++it ) {
  44.         ofs << *it << std::endl;
  45.     }
  46. }
  47. int main()
  48. {
  49.     // données initiales
  50.     const std::string base_dir( "/home/modis/Desktop/Traitement/" );
  51.     const std::string in_dir("fichiers_invers/" );
  52.     const std::string out_dir("données_modèles/données_modèles/2011/" );
  53.     const std::string liste("liste_fichiers_txt.txt" );
  54.     const unsigned int bloc_size = 220;
  55.     const unsigned int blocs_nb  = 186;
  56.     try {
  57.         std::vector<std::string> filelist = get_files(base_dir + liste);
  58.         for ( std::vector<std::string>::iterator it = filelist.begin(); it != filelist.end(); ++it ) {
  59.             swap_blocs( base_dir + in_dir + *it, base_dir + out_dir + *it, blocs_nb, bloc_size);
  60.         }
  61.     } catch ( const std::exception & e ) {
  62.         std::cerr << "Erreur : " << e.what() << "." << std::endl;
  63.     }
  64.     return 0;
  65. }


Toute erreur détectée déclenchera l'arrêt du programme (tu peux coder un autre comportement, fichier de log...)
A+,


Message édité par gilou le 16-09-2014 à 16:16:37

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2238102
gilou
Modérateur
Modzilla
Posté le 16-09-2014 à 18:53:07  profilanswer
 

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 :
  1. #include <algorithm>
  2. #include <fstream>
  3. #include <iostream>
  4. #include <iterator>
  5. #include <sstream>
  6. #include <string>
  7. #include <vector>
  8. #include <stdexcept>
  9. std::vector<std::string> get_files(const std::string& file)
  10. {
  11.     std::ifstream ifs( file.c_str() );
  12.     if (ifs.fail()) {
  13.         throw std::runtime_error( "Echec a l'ouverture du fichier " + file );
  14.     }
  15.     std::vector<std::string> filelist;
  16.     for (std::string line; std::getline( ifs, line ); ) {
  17.         filelist.push_back( line );
  18.     }
  19.     return filelist;
  20. }
  21. void swap_blocs(const std::string& infile, const std::string& outfile, unsigned int blocs_nb, unsigned int bloc_size)
  22. {
  23.     // on ouvre le fichier en entree
  24.     std::ifstream ifs( infile.c_str() );
  25.     if (ifs.fail()) {
  26.         throw std::runtime_error( "Echec a l'ouverture du fichier " + infile );
  27.     }
  28.     // on lit son contenu dans un vecteur de vecteur de doubles
  29.     std::vector<std::vector<double> > lines;
  30.     lines.reserve(40921);
  31.     for (std::string line; std::getline( ifs, line ); /* */) {
  32.         std::istringstream iss( line );
  33.         std::vector<double> numbers;
  34.         numbers.reserve( 6 );
  35.         // on parse les doubles en input et on les range dans le vecteur
  36.         std::copy( std::istream_iterator<double>(iss), std::istream_iterator<double>(), std::back_inserter( numbers ) );
  37.         // on range le vecteur dans le vecteur
  38.         lines.push_back( numbers );
  39.     }
  40.     // On procède au swap des blocs
  41.     for (unsigned int i = 0; i < (unsigned int)(blocs_nb/2); ++i) {
  42.         std::swap_ranges( lines.begin() + (i * bloc_size),
  43.                          lines.begin() + ((i+1) * bloc_size),
  44.                          lines.end()   - ((i+1) * bloc_size) );
  45.     }
  46.     // on ouvre le fichier en sortie
  47.     std::ofstream ofs;
  48.     ofs.open( outfile.c_str(), std::ios::binary );
  49.     if (ofs.fail()) {
  50.         throw std::runtime_error( "Echec a l'ouverture du fichier " + outfile );
  51.     }
  52.     for (std::vector<std::vector<double> >::iterator  it = lines.begin(); it != lines.end(); ++it) {
  53.         for (std::vector<double>::iterator  dt = (*it).begin(); dt != (*it).end(); ++dt) {
  54.             // on écrit un double en binaire. Note: l'endiannesss dépendra de l'OS
  55.             ofs.write( reinterpret_cast<char*>( &(*dt) ), sizeof( double ) );
  56.         }
  57.         // ?? je ne connais pas ton format cible
  58.         ofs << std::endl;
  59.     }
  60. }
  61. int main()
  62. {
  63.     // données initiales
  64.     const std::string base_dir( "/home/modis/Desktop/Traitement/" );
  65.     const std::string in_dir("fichiers_invers/" );
  66.     const std::string out_dir("données_modèles/données_modèles/2011/" );
  67.     const std::string liste("liste_fichiers_txt.txt" );
  68.     const unsigned int bloc_size = 220;
  69.     const unsigned int blocs_nb  = 186;
  70.     try {
  71.         std::vector<std::string> filelist = get_files(base_dir + liste);
  72.         for ( std::vector<std::string>::iterator it = filelist.begin(); it != filelist.end(); ++it ) {
  73.             swap_blocs( base_dir + in_dir + *it, base_dir + out_dir + *it, blocs_nb, bloc_size);
  74.         }
  75.     } catch ( const std::exception & e ) {
  76.         std::cerr << "Erreur : " << e.what() << "." << std::endl;
  77.     }
  78.     return 0;
  79. }


 
A+,


Message édité par gilou le 16-09-2014 à 19:15:16

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Inversion lignes de .txt par blocs

 

Sujets relatifs
[RESOLU] [POWERSHELL] Briser lignes de codesupdater n lignes : combler des trous
Récuperer des lignes dans un ordre précis avec une seule requêteRésumer plusieurs lignes en une seule
Quelle base pour 100 millions de lignes par jourSQL et les Update multi lignes
supprimer des lignes contenant une valeur donnéeDisposition de blocs : comment faire ça ?
Copie de fichiers video selon lignes tableau ExcelFaire un tri dans un tableau avec un nombre de colonnes et lignes aléa
Plus de sujets relatifs à : Inversion lignes de .txt par blocs


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR