2014-03-30 140 views
0

我寫一個結構到一個文件中使用以下行讀取二進制數據從二進制文件

typedef struct _rawData rawDataStruct; 

現在寫的結構進入後文件,我正在閱讀從二進制文件開始使用的結構:

std::cout << "going for print data read from file\n"; 
snif::fileHandler.seekg(0); //, std::ios::beg); 
snif::fileHandler.read(reinterpret_cast<char*>(rawData), sizeof(rawDataStruct)); 

if (snif::fileHandler.fail()) { 
    std::cerr << "reading error\n"; 
    exit(0); 
} 

std::cout << "PSH flag = " << rawData->tcpFlag.PSH << std::endl 
      << "source port " << rawData->sourcePort << std::endl 
      << "destination port " << rawData->destinationPort << std::endl 
      << " sequence number " << rawData->sequenceNumber << std::endl 
      << " Acknowledge number " << rawData->acknowledgeNumber << std::endl 
      << " acknowledge flag " << rawData->tcpFlag.ACK << std::endl 
      << " SYN flag  " << rawData->tcpFlag.SYN << std::endl 
      << "FIN flag  " << rawData->tcpFlag.FIN << std::endl; 

但如果我檢查我的標準輸出,歌廳打印的最後一行是:

"going for print data read from file"; 
+0

您是否在讀取之前檢查過'snif :: fileHandler'是否可以讀取(使用例如'.fail()')?如果打開失敗,我猜你的程序正試圖從標準輸入讀取(文件描述符0)。 – Thomas

回答

0

有證據顯示它沒有代碼,但打開的文件是什麼模式?希望它配置爲binary。要查看可用選項,請查看std::basic_fstreamstd::ios_base::openmode。我建議,以確保以下開放模式設置:

ios::binary | ios::out | ios::in | ios::trunc 

根據什麼目的正在發生的事情,ios::trunc(截)可能必須由ios::app(追加)來代替。

雖然做一些基本的測試,已經發現在我的C++ 11兼容的編譯器,該

fileHandler.write(reinterpret_cast<char*>(rawData), sizeof(rawDataStruct)); 


具有容易由RAWDATA前添加了&運營商解決了一個潛在的問題像這樣:

fileHandler.write(reinterpret_cast<char*>(&rawData), sizeof(rawDataStruct)); 


編譯器應該給予警告,但是這是編譯器版本的隊伍,和-Wall選項或更好是否使用。這可以解釋如何屏幕輸出看起來停止在

"going for print data read from file" 

消息。讀功能還需要&運營商RAWDATA面前:

snif::fileHandler.read(reinterpret_cast<char*>(&rawData), sizeof(rawDataStruct)); 

也許從reinterpret_cast<>操作運行時異常被拋出未捲入。在系統和編譯器記錄之前很難知道。

此外,如果rawData被聲明爲指針,則更好的變量名稱是pRawData,並且發佈更多的代碼。例如,如果pRawData從不指向rawDataStruct的有效實例,則會發生不可預知的事情。

+0

忘記打開,寫入文件後,如果我做fileHandler.close();在那行之後,沒有任何內容是由std :: out – Sigstop

+0

打印的@Startup這個文件需要被打開才能寫入數據。 – 0x499602D2

+0

@ 0x499602D2對不起,我沒有提供代碼聽到,我打開我的文件,如果我檢查文件的大小,它正在增加,由於寫作。 – Sigstop