使用 fstream 读取



我正在使用 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=%#xn",data);
std::cout << "counter: " << c << "n";
c++;
}
fs->close();
}

如您所见,我打印出数据,每次都应该相同,但产生不同的值。 mdfHeader.length 是一个数据块的长度。

首先要更改的是:

  1. 条件eof()仅对确定读取数据失败的原因真正有用,但它不是循环的有用条件。
  2. 您需要在阅读检查您是否成功读取了您感兴趣的数据。

这样,循环将如下所示:

while (*fs) {
// read data from fs
if (*fs) {
// do something with the data
}
else if (!fs->eof()) {
std::cout << "ERROR: failed to read recordn";
}
}

我也猜你不需要搜索,摆脱它们是个好主意:搜索相对昂贵,因为它会失去任何缓冲。您没有显示整个代码,但pos的初始值有公平的机会提供一定程度的随机性。此外,您假设您正在读取的字节序列与数据在计算机中的布局方式相匹配。通常,情况并非如此,您通常需要调整二进制格式,例如,以适应不同大小的单词、不同的字节序、填充等。

计算机就像数学一样,一切都是确定的(即使是像rand这样的函数,如果输入相同,输出也和以前一样)所以如果你使用相同的输入和状态运行代码一百次,你肯定会得到相同的输出,除非输入或运行状态发生变化。

你说每次执行代码时输入都是相同的,所以唯一改变的是运行状态(例如malloc每次运行程序时可能会返回 2 个不同的值,因为它可能在不同的状态下工作,因为它的状态将由操作系统指示)。

在您的代码中,您使用printf("Data=%#xn",data);来输出数据,但它实际上只是将数据的地址打印为 HEX 值,因此很自然地,在多次运行程序时,此地址可能会更改,因为操作系统将您的高管映射到不同的职位或其他任何东西。您应该输出data的内容,您将看到它将与以前的运行相同

最新更新