我使用fstream读取二进制文件,但奇怪的是,每次执行代码时,我都会为同一个输入文件获得不同的值。
if(fs->is_open())
{
while (!fs->eof())
{
fs->seekg( pos );
fs->read( (char *)&mdfHeader, sizeof(mdfHeader_t) );
pos += mdfHeader.length;
fs->read( (char *)&eventHeader, sizeof(eventHeader_t) );
fs->read( (char *)&rawHeader, sizeof(rawHeader_t) );
fs->read( (char *)&ingressHeader, sizeof(ingressHeader_t) );
fs->read( (char *)&l1Header_xc0, sizeof(l1Header_xc0_t) );
fs->read(data, dataLength);
printf("Data=%#x\n",data);
std::cout << "counter: " << c << "\n";
c++;
}
fs->close();
}如您所见,我打印了数据,每次输出的数据应该是相同的,但生成的值不同。mdfHeader.length是一个数据块的长度。
发布于 2012-10-19 22:50:25
首先要改变的是:
eof()只对确定读取数据失败的原因非常有用,但对于循环来说,它不是一个有用的条件。这样,这个循环看起来就像这样:
while (*fs) {
// read data from fs
if (*fs) {
// do something with the data
}
else if (!fs->eof()) {
std::cout << "ERROR: failed to read record\n";
}
}我还猜想你不需要seeks,最好去掉它们:seeks相对昂贵,因为它会释放任何缓冲区。您没有显示完整的代码,但是pos的初始值很有可能提供一定程度的随机性。此外,您还假设正在读取的字节序列与数据在计算机中的布局方式相匹配。通常情况并非如此,您通常需要调整二进制格式,例如,以适应不同大小的单词、不同的字节顺序、填充等。
发布于 2012-10-19 22:51:03
计算机就像数学一样,每件事都是确定的(即使对于像rand这样的函数,如果输入是相同的,输出也和以前一样),所以如果你用相同的输入和状态运行一段代码一百次,你肯定会得到相同的输出,除非输入或运行状态改变。
您说您每次执行代码时输入都是相同的,所以唯一更改的是运行状态(例如,malloc可能会在您每次运行程序时返回2个不同的值,因为它可能工作在不同的状态,因为它的状态将由操作系统指示)。
在你的代码中,你使用printf("Data=%#x\n",data);来输出你的数据,但它实际上只是打印数据的地址作为十六进制值,所以在程序的多次运行中,这个地址可能会改变是很自然的,因为操作系统将你的执行者映射到不同的位置或其他任何地方。您应该输出data的内容,您将看到它与上一次运行时相同
https://stackoverflow.com/questions/12976463
复制相似问题