0

我正在使用 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 是一个数据块的长度。

4

2 回答 2

2

首先要改变的是:

  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 record\n";
    }
}

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

于 2012-10-19T14:50:24.830 回答
1

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

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

在您的代码中,您用于printf("Data=%#x\n",data);输出数据,但实际上它只是将数据地址打印为十六进制值,因此在程序的多次运行中,该地址可能会更改,因为操作系统将您的执行程序映射到不同的位置或其他任何东西,这是很自然的。您应该输出 的内容,data您会看到它与之前的运行相同

于 2012-10-19T14:51:02.633 回答