Lecture d'un fichier

Résolu
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009 - 13 mai 2009 à 10:42
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

5 réponses

Seomaz Messages postés 10 Date d'inscription jeudi 8 janvier 2009 Statut Membre Dernière intervention 19 mai 2009
13 mai 2009 à 15:52
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
3
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mai 2009 à 17:15
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++
3
fregolo52 Messages postés 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
13 mai 2009 à 12:37
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.
0
chalmia2s Messages postés 31 Date d'inscription mercredi 18 février 2009 Statut Membre Dernière intervention 15 octobre 2009
13 mai 2009 à 13:44
comment faire pour recuperer le contenue octet par octet?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
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++;
}
0
Rejoignez-nous