2009-09-17 9 views
1

J'ai 2 applications. Un en C++ (Windows) ouvrir un fichier binaire et ne fait que lire, je l'utilise:Écrire au fichier binaire en C++ et C#

fstream m_fsDataIN.open("C:\TTT", ios::in | ios::binary | ios::app); 

et la deuxième application (est en C#) ouvre le fichier et lui écrit. J'utilise:

byte[] b = ... //have a binary data 
System.IO.BinaryWriter bw = new System.IO.BinaryWriter(
         System.IO.File.Open(@"C:\TTT", 
         System.IO.FileMode.Append, 
         System.IO.FileAccess.Write, 
         System.IO.FileShare.ReadWrite)); 
bw.Write(b); 
bw.Flush(); 
bw.Close(); 

Le problème est que les 8 premiers octets sont écrits de manière incorrecte, la comparaison à ce qui apparaît dans le tableau b.

Lorsque j'ouvre le fichier dans l'application C#, l'utilisation de System.IO.FileMode.Append fonctionne correctement.

J'ai vérifié dans l'application et il écrit 8 octets faux.

Je veux ajouter que les 8 premiers octets sont 2 compteurs qui ont chacun été créés en utilisant IPAddressHostToNetworkAddress.

Je pense que le problème est dans l'application C++, dans la façon dont j'ouvre le fichier.

Aide, Thnaks

+0

Peut-être utile si vous nous montrez votre code qui utilise 'IPAddressHostToNetworkAddress'. Cela me semble un problème d'endianisme. – Noldorin

+0

Roman: l'ouverture semble OK mais vous ne montrez pas comment vous lisez dans le flux. La lecture d'un flux peut être formatée (en utilisant l'opérateur <<) ou non; cela peut faire toute la différence. Pourriez-vous poster ces parties aussi? – LaszloG

+0

Lecture: std :: vecteur \t m_vctDataIN; m_vctDataIN.resize (1000); m_fsDataIN.read (& m_vctDataIN [], 1000); int nReadBytes \t = m_fsDataIN.gcount(); m_nBytesInBuffer + = nReadBytes; *** J'ai trouvé une autre chose: Lorsque l'application C++ est arrêtée, l'application C# écrit correctement. Quand il est en place, il écrit mal. –

Répondre

0

Le problème était dans l'application C++. Le programme contenait la configuration qui produisait un autre gestionnaire de fichiers. En utilisant l'explorateur de processus j'ai découvert à ce sujet. La suppression de la configuration de ce gestionnaire de fichiers supplémentaire a résolu le problème.

0

Vous avez ouvert juste bien. Mais comment le lis-tu? Je pense que vous devez appeler ntohl sur le côté C++.

+0

Lecture: std :: vector m_vctDataIN; m_vctDataIN.resize (1000); m_fsDataIN.read (& m_vctDataIN [], 1000); int nReadBytes = m_fsDataIN.gcount(); m_nBytesInBuffer + = nReadBytes; *** J'ai trouvé une autre chose: Lorsque l'application C++ est en panne, l'application C# écrit correctement.Quand il est en place, il écrit mal –

+0

lisez-vous et écrivez-vous dans le même fichier simultanément? –

+0

oui, mais l'application C# écrit et C++ lit, sauf qu'au début, le C# fait lire et fermer le fichier. –

Questions connexes