我正在使用以下行将结构写入文件:
std::fstream snif::fileHandler;
fileHandler.write(reinterpret_cast<char*>(rawData), sizeof(rawDataStruct));
其中rawdataStruct
是:
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 :(得分:0)
没有代码显示它,但文件打开的是什么模式?希望它配置为binary
。要查看可用选项,请查看std::basic_fstream
和std::ios_base::openmode
。我建议确保设置以下开放模式:
ios::binary | ios::out | ios::in | ios::trunc
根据发生的目的,ios::trunc
(truncate)可能必须由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"
消息。 read函数还需要rawData:
前面的&
运算符
snif::fileHandler.read(reinterpret_cast<char*>(&rawData), sizeof(rawDataStruct));
可能抛出了reinterpret_cast<>
运算符的运行时异常,但未被捕获。在记录系统和编译器之前很难知道。
此外,如果rawData
被声明为指针,那么更好的变量名称为pRawData
,以及发布更多代码。例如,如果pRawData
永远不会指向rawDataStruct
的有效实例,则会发生不可预测的事情。