Lecture de fichier c++

Résolu/Fermé
zvib Messages postés 62 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 27 octobre 2009 - 17 mars 2008 à 11:03
zvib Messages postés 62 Date d'inscription vendredi 7 mars 2008 Statut Membre Dernière intervention 27 octobre 2009 - 21 avril 2008 à 14:16
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 vendredi 7 mars 2008 Statut Membre Dernière intervention 27 octobre 2009 21
18 mars 2008 à 11:12
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 vendredi 7 mars 2008 Statut Membre Dernière intervention 27 octobre 2009 21
21 avril 2008 à 14:16
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