Problème de lecture de fichiers binaires
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 :
Code:
1 2 3
|
template<typename T>
static vector<float> *LoadFile(char const * fileName, T nbBytes) |
Je fais ça car quand je lis le fichier je procède ainsi :
Code:
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;
} |
Je n'ai pas l'impression de bien programmer en faisant ça :( . D'autant que pour l'appel de fonction ça devient par exemple:
Code:
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); |
Je ne sais pas le faire correctement donc si vous avez des pistes svp ?
Pour le code complet de la fonction :
Code:
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);
}
} |