2009-09-17 91 views
1

我有2個應用程序。一個在C++(窗口)打開一個二進制文件,並從中只讀取,我使用:在C++和C中寫入二進制文件#

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

和第二應用(在C#)打開文件,並寫入到它。我使用:

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(); 

的問題是,8個字節不正確寫入,比較一下出現b陣列英寸

當我在C#應用程序中打開文件時,使用System.IO.FileMode.Append它工作正常。

我檢查了應用程序,它寫錯了8個字節。

我想補充一點,前8個字節是2個計數器,每個計數器都是使用IPAddressHostToNetworkAddress創建的。

我認爲問題出在C++應用程序中,我如何打開文件。

幫助, Thnaks

+0

如果您向我們展示使用'IPAddressHostToNetworkAddress'的代碼,可能會有所幫助。無論如何,聽起來像是一個排序問題。 – Noldorin 2009-09-17 10:56:11

+0

羅馬:開放看起來不錯,但你不顯示你如何從流中讀取。從流中讀取可以格式化(使用operator <<)或不使用;這可以使所有的差異。你可以發佈這些部分嗎? – LaszloG 2009-09-17 10:58:33

+0

閱讀: std ::向量 \t m_vctDataIN; m_vctDataIN.resize(1000); m_fsDataIN.read(&m_vctDataIN [],1000); int nReadBytes \t = m_fsDataIN.gcount(); m_nBytesInBuffer + = nReadBytes; ***我發現了一件事: 當C++應用程序關閉時,C#應用程序正確寫入。當它結束時,它寫錯了。 – 2009-09-17 11:04:01

回答

0

問題出在C++應用程序中。該程序包含產生另一個文件處理程序的配置。 使用Process Explorer我發現了它。 刪除該額外文件處理程序的配置解決了該問題。

0

你打開了它就好了。但你怎麼讀它?我想你需要在C++方面打電話ntohl

+0

閱讀:std :: vector m_vctDataIN; m_vctDataIN.resize(1000); m_fsDataIN.read(&m_vctDataIN [],1000); int nReadBytes = m_fsDataIN.gcount(); m_nBytesInBuffer + = nReadBytes; ***我發現了一件事:當C++應用程序關閉時,C#應用程序正確寫入。當它啓動時,它寫錯了 – 2009-09-17 11:04:33

+0

你正在同時讀取和寫入同一個文件嗎? – 2009-09-17 11:18:44

+0

是的,但是C#應用程序寫入和C++讀取,除非在C#開始時讀取和關閉文件。 – 2009-09-17 12:26:00