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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 - 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.

A voir également:

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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334
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 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023
20 mai 2015 à 09:57
Merci à vrai dire j'avais hésité ! C'est fait :)
0
Lapourax Messages postés 3006 Date d'inscription vendredi 15 mars 2013 Statut Contributeur Dernière intervention 17 février 2023 334 > 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