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

Résolu/Fermé
Benoît - Modifié par Benoît le 19/05/2015 à 09:51
Lapourax
Messages postés
2996
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
12 avril 2022
- 20 mai 2015 à 10:00
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.

1 réponse

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
2996
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
12 avril 2022
347
20 mai 2015 à 09:42
Lu'

Tu peu poster la solution des fois que ça intéresse quelqu'un :)
0
Benoît > Lapourax
Messages postés
2996
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
12 avril 2022

20 mai 2015 à 09:57
Merci à vrai dire j'avais hésité ! C'est fait :)
0
Lapourax
Messages postés
2996
Date d'inscription
vendredi 15 mars 2013
Statut
Contributeur
Dernière intervention
12 avril 2022
347 > Benoît
20 mai 2015 à 10:00
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