Bonjour,
Dans mon programme, j'ouvre des fichiers binaires (qui sont des images). Certain fichiers ont les valeurs codées sur 1 octet d'autres sur 2 et enfin d'autres sur 4.
J'ai donc voulu écrire un Loader qui permet en renseignant le nombre d'octets sur lesquelles les valeurs sont codés de charger les données de l'image pour les mettre dans un vecteur de floats (car après je travaille avec des images flottantes.
C'est à ce moment que j'ai un problème :
Pour faire une fonction qui est générique, je bricole en déclarant la fonction template pour le nombres d'octets lus :
Je fais ça car quand je lis le fichier je procède ainsi :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 template<typename T> static vector<float> *LoadFile(char const * fileName, T nbBytes)
Je n'ai pas l'impression de bien programmer en faisant ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 while (i<vecSize) //vecSize est la taille du fichier binaire/nbBytes { T val; inFile.read(reinterpret_cast<char*>(&val), nbBytes); (*res)[i] = float(val); ++i; }. D'autant que pour l'appel de fonction ça devient par exemple:
Je ne sais pas le faire correctement donc si vous avez des pistes svp ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 vector<float> *rawData = RawDataLoader::LoadFile(mask.c_str(),(float)4); //ou vector<float> *rawData = RawDataLoader::LoadFile(mask.c_str(),(unsigned char)1);
Pour le code complet de la fonction :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 template<typename T> static vector<float> *LoadFile(char const * fileName, T nbBytes) { ifstream inFile(fileName, ifstream::binary); if (inFile) { inFile.seekg(0, inFile.end); int length = inFile.tellg(); inFile.seekg(0, inFile.beg); cout << "length is " << length << endl; size_t vecSize = length/nbBytes; vector<float> *res = new vector<float>(vecSize); unsigned int i = 0; while (i<vecSize) { T val; inFile.read(reinterpret_cast<char*>(&val), nbBytes); (*res)[i] = float(val); ++i; } inFile.close(); return res; } else { cerr << "When openning " << fileName << " : no such file or directory" << endl; exit(1); } }
Partager