IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Inversion des lignes d'un .txt par blocs


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 71
    Points : 47
    Points
    47
    Par défaut Inversion des lignes d'un .txt par blocs
    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 !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    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

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 71
    Points : 47
    Points
    47
    Par défaut
    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é :

    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;
    }
    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

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    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

Discussions similaires

  1. transformer des infos excel en txt par vba
    Par origami82 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 11/02/2010, 22h01
  2. [POO] Inverser des lignes dans une table
    Par marts dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 24/10/2008, 18h57
  3. Supprimer des lignes dans un TXT pendant un Output
    Par tibofo dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 10/10/2008, 23h47
  4. Inverser des lignes dans un fichier
    Par sentinnelle dans le forum Tcl/Tk
    Réponses: 1
    Dernier message: 25/02/2008, 10h42
  5. [Batch] inserer des ligne dans un prog par batch
    Par mirlidas dans le forum Scripts/Batch
    Réponses: 3
    Dernier message: 28/04/2007, 11h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo