Erreur lors de la lecture de gros fichiers sur réseau local

Erreur lors de la lecture de gros fichiers sur réseau local - C++ - Programmation

Marsh Posté le 27-01-2012 à 11:10:19    

Bonjour à tous,

 


J'ai développé une application qui lit et écrit de gros fichiers binaires en c++ (de l'ordre du go). Lorsque les fichiers lus par mon application sont en local, tout va bien. A l'inverse, lorsque les fichiers lus sont sur une autres machine du réseau local, mon application ne plante pas mais semble "mal lire" les fichiers (des octets différents, ...).

 

J'utilise le code suivant pour initialiser mon flux de lecture:

 

std::ifstream inGraphe(cheminDuFichierSurLeReseau.c_str(), ios::in | ios::binary );

 

Celui-ci est utilisé pour lire des primitives (notamment entiers non signés 32 bits):

 


void lireBinaire(ifstream& in, type_val& v){
    in.read((char*)&v, sizeof(v));
}

 

ainsi que des vecteurs d'objets. Je lis notamment d'une traite un vecteur d'objets sérialisé représentant plus de 99% du volume du fichier, via la méthode:

 

template < typename type_val >
inline void lireSequenceBinaire(ifstream& in, type_val* p_v, size_t nbr_){
     in.read(reinterpret_cast<char*>(p_v), sizeof(type_val)*nbr_);
}

 

D'où peut provenir ce comportement anormal lorsque je lis le fichier sur une machine du réseau local et non sur la machine où s'exécute l'application?

 

Vous remerciant par avance,
Cordialement.


Message édité par godbeni le 27-01-2012 à 11:19:23
Reply

Marsh Posté le 27-01-2012 à 11:10:19   

Reply

Marsh Posté le 27-01-2012 à 11:19:49    

Citation :

mon application ne plante pas mais semble "mal lire" les fichiers

Machines avec une architecture différente, problème d'endianness probablement.
http://fr.wikipedia.org/wiki/Endianness
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 27-01-2012 à 12:30:03    

gilou a écrit :

Citation :

mon application ne plante pas mais semble "mal lire" les fichiers

Machines avec une architecture différente, problème d'endianness probablement.
http://fr.wikipedia.org/wiki/Endianness
A+,


Non, little-endian sur les deux machines et si je rapatrie le fichier en local, tout se passe bien. Globalement, l'ensemble des octets lus est cohérent mais certains sont erronés (L'en-tête consistant en des entiers non signés /le 32 bits (donc soumis à l'endianess) est bien lue).


Message édité par godbeni le 27-01-2012 à 12:32:01
Reply

Marsh Posté le 27-01-2012 à 13:46:32    

quel système sur les deux machines, 32 ou 64 bits?
 

Code :
  1. template < typename type_val >
  2. inline void lireSequenceBinaire(ifstream& in, type_val* p_v, size_t nbr_){
  3.      in.read(reinterpret_cast<char*>(p_v), sizeof(type_val)*nbr_);


 
sizeof(type_val) ne vaut pas forcément la même chose partout. genre un long fera 4 octets sous win32, win64 et mac os 32 mais fera 8 octets sous mac os 64.

Reply

Marsh Posté le 27-01-2012 à 14:58:31    

Citation :

Non, little-endian sur les deux machines et si je rapatrie le fichier en local, tout se passe bien.

Dans les deux cas, c'est la même machine qui mit un même fichier, et s'il est en local, ça colle, et s'il est distant, ça merde? c'est bien ça?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 31-01-2012 à 09:10:58    

gilou a écrit :

Citation :

Non, little-endian sur les deux machines et si je rapatrie le fichier en local, tout se passe bien.

Dans les deux cas, c'est la même machine qui mit un même fichier, et s'il est en local, ça colle, et s'il est distant, ça merde? c'est bien ça?
A+,


 
oui exactement.

Reply

Marsh Posté le 31-01-2012 à 13:14:27    

Si tu compares un fichier envoyé à un fichier reçu, les erreurs commencent toujours a peu près au bout du même nb d'octets?
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed