首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用fstream读取

使用fstream读取
EN

Stack Overflow用户
提问于 2012-10-19 22:33:03
回答 2查看 388关注 0票数 0

我使用fstream读取二进制文件,但奇怪的是,每次执行代码时,我都会为同一个输入文件获得不同的值。

代码语言:javascript
复制
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是一个数据块的长度。

EN

回答 2

Stack Overflow用户

发布于 2012-10-19 22:50:25

首先要改变的是:

  1. The condition eof()只对确定读取数据失败的原因非常有用,但对于循环来说,它不是一个有用的条件。
  2. 您需要在读取后检查是否成功读取了您感兴趣的数据。

这样,这个循环看起来就像这样:

代码语言:javascript
复制
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的初始值很有可能提供一定程度的随机性。此外,您还假设正在读取的字节序列与数据在计算机中的布局方式相匹配。通常情况并非如此,您通常需要调整二进制格式,例如,以适应不同大小的单词、不同的字节顺序、填充等。

票数 2
EN

Stack Overflow用户

发布于 2012-10-19 22:51:03

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12976463

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档