Erreur lors de la lecture de gros fichiers sur réseau local - C++ - Programmation
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+,
Marsh Posté le 27-01-2012 à 12:30:03
gilou a écrit :
Machines avec une architecture différente, problème d'endianness probablement. |
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).
Marsh Posté le 27-01-2012 à 13:46:32
quel système sur les deux machines, 32 ou 64 bits?
Code :
|
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.
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+,
Marsh Posté le 31-01-2012 à 09:10:58
gilou a écrit :
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? |
oui exactement.
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+,
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