使用fstream阅读

时间:2012-10-19 14:33:03

标签: c++ 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=%#x\n",data);

      std::cout << "counter: " << c << "\n";
      c++;
    }

    fs->close();

  }

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

2 个答案:

答案 0 :(得分:2)

要改变的第一件事是:

  1. 条件eof()仅对确定读取数据失败的原因非常有用,但它不是循环的有用条件。
  2. 您需要在之后检查是否已成功阅读了您感兴趣的数据。
  3. 那,循环看起来像这样:

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

答案 1 :(得分:1)

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

你说每次执行代码时输入都是一样的,所以只有改变的是运行状态(例如malloc每次运行程序时可能返回2个不同的值,因为它可能有效在不同的状态,因为它的状态将由OS表示。

在您的代码中使用printf("Data=%#x\n",data);输出数据,但它实际上只是将数据地址打印为HEX值,因此很自然地,在程序的多次运行中,此地址可能会因为OS映射而更改执行到不同的职位或其他任何事情。您应该输出data的内容,您将看到它与之前的运行相同