从二进制文件中读取二进制数据

时间:2014-03-30 18:25:28

标签: c++

我正在使用以下行将结构写入文件:

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";

1 个答案:

答案 0 :(得分:0)

没有代码显示它,但文件打开的是什么模式?希望它配置为binary。要查看可用选项,请查看std::basic_fstreamstd::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的有效实例,则会发生不可预测的事情。