Inversion lignes de .txt par blocs

Inversion lignes de .txt par blocs - C++ - Programmation

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 !

Reply

Marsh Posté le 12-09-2014 à 16:56:26   

Reply

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 :
  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é!  --
Reply

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 :
  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
Reply

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 :
  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é!  --
Reply

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 :
  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é!  --
Reply

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

Reply

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

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 !!

Reply

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


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

Marsh Posté le 16-09-2014 à 14:42:55    

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é!  --
Reply

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


Merci encore !

Reply

Marsh Posté le 16-09-2014 à 15:23:22   

Reply

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


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

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 :
  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é!  --
Reply

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 :
  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é!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed