Lecture de fichier c++

Résolu
zvib Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -  
zvib Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,
Etant donné un fichier d'entrée contenant uniquement des nombres (int ou double) en lignes, je voudrais récupérer ces nombres pour remplir des tableaux. J'ai trouvé une solution assez compliquée pour les int mais pour les doubles pour l'instant je n'ai pas encore trouvé... Si je veux utiliser la même technique pour les doubles il me faut un moyen pour connaître le nombre de chiffres apèrs la virgule, je ne trouve pas une fonction qui permet de faire ça...

Je pense qu'il y a beaucoup plus simple, pouvez-vous m'aider?

Ma solution:

void myClass::computeFromFile(const char* nomFich) {
	std::ifstream fichier(nomFich);
	if(fichier){
	int value, dec = 0;
	std::string ligne;
	while ( std::getline( fichier, ligne ) ){
	for(int i = 0; i < nb; i++){
		sscanf(ligne.c_str()+dec,"%d ",&value);
		tab[i]+=value;
		dec+=length(value)+1;
	}}}
}

int myClass::length(int Valeur){
	int Retour = 0;
	if(Valeur < 0) {
	Retour++;
	Valeur = -1 * Valeur;
	}
	while(Valeur !=0) {
	Retour++;
	Valeur = Valeur / 10;
	}
	return Retour;
}


Merci d'avance
A voir également:

1 réponse

zvib Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   21
 
Bon j'ai trouvé une solution pour les doubles, je la poste mais je veux bien de l'aide si vous trouvez plus simple/élégant.

void myClass::computeFromFile(string inName) {
        ifstream fichier(inName.c_str());
	if(fichier){
	double value;
	size_t dec;
	int nbLignes = 0;
	std::string ligne, chaine;
	while ( std::getline( fichier, ligne ) ){
        	dec = 0;
	        chaine = "";
          	if(nbLignes<nbMax){
	                sscanf(ligne.c_str(),"%lf",&value);
		        Tab[nbLignes]=value;		
         		sprintf((char*)chaine.c_str(),"%lf",value);
        		dec=(int)strlen((char*)chaine.c_str())+1;
        		sscanf(ligne.c_str()+dec,"%lf",&value);
            	       	Tab2[nbLignes]=value;
        		nbLignes++;
	        }
        }
}


Ici, les fichiers sont toujours à deux colonnes. Cette méthode gère les doubles qui peuvent être écrit dans le fichier comme "13.00000" qui peuvent être interprété comme 13 lors d'autres conversions vers des chaines de caractères...
0
zvib Messages postés 62 Date d'inscription   Statut Membre Dernière intervention   21
 
Beaucoup mieux:

void load(string modelName) {
	filebuf fbIn;
	fbIn.open(modelName.c_str(),ios::in);
	istream fileIn(&fbIn);
	init(modelName);
	load(fileIn);
	fbIn.close();
}

void load(istream& file) {
	double mean,sigma;
	int i = 1;
	while (file>>mean>>sigma) {
		Mean(i) = mean;
		Sigma(i) = sigma;
		i++;
	}
}
0