Lecture d'un fichier [Résolu]

Signaler
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
-
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009
-
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

5 réponses

Messages postés
10
Date d'inscription
jeudi 8 janvier 2009
Statut
Membre
Dernière intervention
19 mai 2009

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
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
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++
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

comment faire pour recuperer le contenue octet par octet?
Messages postés
31
Date d'inscription
mercredi 18 février 2009
Statut
Membre
Dernière intervention
15 octobre 2009

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++;
}