Help code lecture/écriture et recherche de suites de caractères

Résolu
Benoît -  
Lapourax Messages postés 4380 Statut Contributeur -
Bonjour à tous,

J'ai un petit souci avec un code C++, je vous expose mon problème :
J'ai un très gros fichier (4.5 Go) à analyser. Il est simplement composé d'une ligne d'introduction, puis de deux colonnes sur x lignes.
La phrase d'introduction ne m'intéresse absolument pas. Par contre les lignes suivantes représentent un temps (très précis) auquel est associé une valeur booléenne.

Je créé un programme pour analyser ce fichier car il est trop gros et impossible à lire à la main.
Mon code consiste à lire dans ce fichier et à calculer le temps pendant lequel on a une suite de "0". Il peut y avoir plusieurs suites de "0".

Voici mon code :
#include <fstream> //inclusion de la bibli pour lire un fichier
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>

using namespace std;

int main()
{

ifstream fichier("FichierAAnalyser.txt", ios::in);
int nombreDef = 0;
string debutTempsDef[1000];
string finTempsDef[1000];
int i = 0;

if(fichier) // si l'ouverture a réussi

{
fstream resul("dispo.txt", ios::out | ios::trunc);
fstream fichierDef("def.txt", ios::out | ios::trunc);
string ligne;

while(getline(fichier, ligne)) // tant que l'on peut mettre la ligne dans "contenu"
{
string entete1;
string entete2;
string temps;
string dispo;

fichier >> entete1 >> entete2 >> temps >> dispo;
cout << entete1+"\n";
cout << entete2+"\n";
cout << temps+" \n";
cout << dispo;

if(resul)
{
resul << temps << " " << dispo << "\n";
if (dispo.compare("0") == 0){
nombreDef = nombreDef + 1;
i = i + 1;
debutTempsDef[i] = temps;

if(fichierDef){
fichierDef << "Début de la défaillance : " << debutTempsDef[i] << " Fin de la défaillance : " << finTempsDef[i] << "\n";
}

}
while (dispo.compare("0") == 0){}

finTempsDef[i] = temps;

}
}
}
}


Mon deuxième "while" sert à parcourir les lignes tant qu'il y a des zéros. Une fois que je sors de cette boucle, cela signifie que mon temps sera associé à un 1. Je recherche alors une autre suite de "0"...

J'arriver bien à lire dans mon fichier à analyser, par contre, les suites de "0" ne s'enregistre pas dans mon fichier def.txt.


Quelqu'un aurait une idée svp ?

Merci de m'avoir lu.

A voir également:

1 réponse

Benoît
 
J'ai finalement réussi à résoudre mon problème :
Il y avait plusieurs soucis, mais le plus gros venait de mon "while()" à la fin.

Voilà mon code final :

#include <fstream> //inclusion de la bibli pour lire un fichier
#include <iostream>
#include <string>
#include <stdio.h>
#include <string.h>

using namespace std;
  
int main()
{		

        ifstream fichier("ProjetBH-TopologieDefaillanteRmodif.txt", ios::in); 
		int nombreDef = 0;
		string debutTempsDef[1000];
		string finTempsDef[1000];
		int i = 0;
		int testPair = 1;
		bool def = 0;

        if(fichier)
        {  
			fstream resul("dispo.txt", ios::out | ios::trunc);
			fstream fichierDef("def.txt", ios::out | ios::trunc);
			string ligne;

			while(getline(fichier, ligne))  
			{
		
				string entete1;
				string entete2;
				string temps;
				string dispo;

				fichier >> temps >> dispo; 

				if (testPair%2 == 0)
				{
					if(resul)
					{
						resul << temps << " " << dispo << "\n";
			
						if (dispo.compare("0") == 0)
						{
							if(def == 0)
							{
							nombreDef = nombreDef + 1;
							i = i + 1;
							debutTempsDef[i] = temps;
				
							if(fichierDef)
							{
								fichierDef << "Début de la défaillance : " << debutTempsDef[i] << " Numéro de défaillance : " << nombreDef << "\n";
							}

							def = 1;
							}
							
						}
			
						if (dispo.compare("1") == 0)
						{	
							if(def == 1)
							{
								finTempsDef[nombreDef] = temps;
								fichierDef << "Fin de la défaillance numéro: " << nombreDef << " au temps : " << finTempsDef[nombreDef] << "\n";
							}
							def = 0;
						}
					}
				}

				testPair = testPair + 1;
			}
		}
}

		


Si quelqu'un a des questions j'y répondrai sans problème, car je n'ai pas détaillé tout l'étendu de mon fichier à analyser et le problème exact.

Merci quand même.
0
Lapourax Messages postés 4380 Statut Contributeur 334
 
Lu'

Tu peu poster la solution des fois que ça intéresse quelqu'un :)
0
Benoît > Lapourax Messages postés 4380 Statut Contributeur
 
Merci à vrai dire j'avais hésité ! C'est fait :)
0
Lapourax Messages postés 4380 Statut Contributeur 334 > Benoît
 
Merci :)

En effet la logique qui ressort du deuxième code est bien meilleure :]
J'allais te proposer de faire un seul while avant que je ne vois que tu avais déjà trouvé la solution :)

Beau boulot !
0