Lecture d'un fichier [Résolu]

Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
- - Dernière réponse : chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
- 13 mai 2009 à 18:13
Bonjour,


je fais un dll en c++ avec laquelle j'aimerai lire le contenu de deux fichiers et comparer l'element se trouvant à la position 'n' du fichier 1 avec l'element n du fichier 2.


Le contenu des fichiers est sous la form:
0.3769 0.4217 0.4139 0.3477 0.3154 0.3041 0.309 0.317 0.3243 0.4351 0.3798 0.2441 0.3586 0.4465 0.3616 0.207 0.3426 0.3654 0.3633 0.3004 0.3525 0.3913 0.3899 0.3123 0.3584 0.2666 0.3556 0.3989 0.3529 0.2763 0.3749 0.4165 0.3381 0.334 0.3892 0.3621 0.3323 0.3245 .............


pour lire les fichier j'ai fait comme ça:


const char f1 =('data1.pts');
ifstream file1(&f1, ios::in);
float* dataIn1;
int sz = 20*2;                     // le nombre des elements du type: 0.3769
dataIn1 = new float[sz];
file1.read((char*)dataIn1, sz); 
file1.close();


Je n'ai jamais raveiller tavec des I/O et là j'ai des problemes.


J'ai essayer avec: 
"file1.getline((char*)dataIn1, sz)" mais ça ne marche pas aussi.


J'ai fais:
begin = file1.tellg();
file1.seekg (0, ios::end);
end = file1.tellg();
mais j'obtiens end.begin=0!!! 


le programme compile mais donne des resultats faux, quand j'essaie le lire le fichier 1 par exemple pour controler son contenue j'obtiens  
dataIn1[0]=-431602080
dataIn1[2]=-431602080
dataIn1[10]=-431602080
dataIn1[30]=-431602080


je ne sais pas ou est le probleme! j'espere que quelqu'un de vous aurez une idee de comment regler ça...


Merci
Afficher la suite 

5 réponses

Meilleure réponse
Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009
3
Merci
essaye ça, (en considérant qu'il y a une valeur par ligne):

FILE * data1 = fopen("data1.pts", "r"); //ouvre data1.pts en mode lecture seule
char line[1000];
int size = 20*2;
float * dataInt1 = new float[size];
int i=0;

while( fgets( line, sizeof( line ), data1) )
{
   dataInt1[i] = atof(line); //conversion d'une chaine de char en float
   i++;
}
fclose(data1);

les fonctions fopen, fgets, et le tyedef FILE sont dans stdio.h
la fonction atof est dans stdlib.h

voila. Tiens nous au courant

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Seomaz
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
3
Merci
La question étant en categ Windows, on va mettre du Windows.

"0.3769 0.4217 0.4139 0.3477 0.3154 0.3041 0.309 0.317 0.3243 0.4351 0.3798 0.2441 0.3586 0.4465 0.3616 0.207 0.3426 0.3654 0.3633 0.3004 0.3525 0.3913 0.3899 0.3123 0.3584 0.2666 0.3556 0.3989 0.3529 0.2763 0.3749 0.4165 0.3381 0.334 0.3892 0.3621 0.3323 0.3245"
Voila ce que j'ai mis dans un txt (sans les guillemets bien entendu).
Le code ci dessous tourne impec.

#include <windows.h>
#include <stdio.h>


#define MEMDISPO    (MEM_COMMIT | MEM_RESERVE)


char szappname[] = "LireFlt";


void TestLecture()
{
  HANDLE hfl;
  float *pflts = 0;
  char buf[20], *c;
  DWORD size, rw, i, n = 0;
 
  hfl = CreateFile("D:\\flts.txt", GENERIC_READ, 0, 0, OPEN_EXISTING, 0, 0);
  if(hfl == INVALID_HANDLE_VALUE) return;
 
  size = GetFileSize(hfl, 0);
  if(GetLastError()) goto closeFL;
  if(size < 6) goto closeFL; // FICHIER INVALIDE RAPPORT AUX SPECS
 
  pflts = (float*) VirtualAlloc(0, size + 1, MEMDISPO, PAGE_READWRITE);
  if(!pflts) goto closeFL;
 
  ReadFile(hfl, pflts, size, &rw, 0);
  if(rw != size) goto closeFL;
 
  c = (char*) pflts;
depuisASCII:
  pflts[n] = (float) atof(c);
  n++;
  if(size <= 3) goto closeFL;
  size -= 3;
  c += 3; // PASSONS AU SUIVANT
goPROCHAIN:
  if(*c == 0) goto closeFL; // FINI FICHIER
  if(*c == 32) goto okPROCHAIN;
  size--;
  c++;
  goto goPROCHAIN;
okPROCHAIN:
  c++;
  size--;
  goto depuisASCII;
 
closeFL:
  CloseHandle(hfl);
  if(!pflts) return;
  if(!n) goto relMEM;
 
  for(i = 0; i < n; i++) {
    sprintf(buf, "%.5f", pflts[i]);
    MessageBox(0, buf, szappname, 0);
  }
relMEM: VirtualFree(pflts, 0, MEM_RELEASE);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE x, PSTR y, int z)
{
  TestLecture();
  return 0;
}

ciao...
BruNews, MVP VC++

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 217 internautes nous ont dit merci ce mois-ci

Commenter la réponse de BruNews
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
je serais toi, je récupérerais le contenu du fichier octet par octet.
ces octets seraient dans un tableau de char. Dès que ton octet est un espace, c'est que les octets précédant est la représentant de ton nom en chaine de caractères.
tu fais strtod.
tu reset ta chaine et tu continues la lecture du fichier.
Commenter la réponse de fregolo52
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
0
Merci
comment faire pour recuperer le contenue octet par octet?
Commenter la réponse de chalmia2s
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
0
Merci
salut,




merci pour la réponse , j'ai fait autrement et ça a marcher:
sachant que dans chacuns des fichiers de la forme: 0.3769 0.4217 0.4139 0.3477 0.3154 0.3041 0.309 ....
il y a 20 vecteurs de dimension 3, voila:




int np;
int nbp=20;
const char *f1 = ('data1.pts');
const char *f2 = ('data2.pts');
ifstream file1(f1, ios::in);
ifstream file2(f2, ios::in);
while (np < nbp){
 for (int i = 0; i < 3; i++) {
  if(!(file1 >> p1[i])) return false;
  if(!(file2 >> p2[i])) return false;
 }
 np++;
}
Commenter la réponse de chalmia2s