Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用fstream读取_C++_Fstream - Fatal编程技术网

C++ 使用fstream读取

C++ 使用fstream读取,c++,fstream,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

我使用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();

  }
if(fs->is_open())
{
而(!fs->eof())
{
fs->seekg(位置);
fs->read((char*)&mdfHeader,sizeof(mdfHeader_t));
pos+=MDF头长度;
fs->read((char*)&eventHeader,sizeof(eventHeader_t));
fs->read((char*)&rawHeader,sizeof(rawHeader_t));
fs->read((字符*)和Ingresheader,sizeof(Ingresheader_t));
fs->read((char*)&l1Header\uxc0,sizeof(l1Header\uxc0\t));
fs->读取(数据、数据长度);
printf(“数据=%#x\n”,数据);

std::cout首先要改变的是:

  • 条件
    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";
        }
    }
    
    while(*fs){
    //从fs读取数据
    如果(*fs){
    //对数据做点什么
    }
    如果(!fs->eof()),则为else{
    
    std::cout首先要改变的是:

  • 条件
    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";
        }
    }
    
    while(*fs){
    //从fs读取数据
    如果(*fs){
    //对数据做点什么
    }
    如果(!fs->eof()),则为else{
    
    std::cout计算机就像数学一样,每件事都是确定的(即使对于像
    rand
    这样的函数,如果输入相同,输出也和以前一样),所以如果你用相同的输入和状态运行代码一百次,你肯定会得到相同的输出,除非输入或运行状态发生变化

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


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

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

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


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

    您需要打印更多的诊断数据。
    pos
    中的值是多少;mdfHeader中的值是多少;mdfHeader.length中的值是多少;以及读取的每个其他变量?您是否在操作期间检查I/O状态?所有变量是如何创建和分配的?第二个@JonathanLeffler。什么是
    pos
    初始化ed to?打印出来的数据如何与文件中实际存在的数据相对应?您能识别出任何东西吗?如果是,实际结果与预期结果相比相差多远?如果您知道相差多少字节,那么当该数字出现在调试器中时,您可能会识别出来,并指出错误的来源。您需要打印出更多的诊断数据。
    pos
    中的值是多少;mdfHeader中的值是多少;mdfHeader.length中的值是多少;以及读取的每个其他变量?您是否在操作过程中检查I/O状态?如何创建和分配所有变量?第二次@JonathanLeffler。什么是
    pos
    初始化d到?打印出来的数据如何与文件中实际存在的数据相对应?您能识别出任何东西吗?如果是,实际结果与预期结果相比相差多远?如果您知道相差多少字节,那么当它出现在调试器中时,您可能会识别出该数字,并指出错误的来源。T这当然是一种可能性——可能是一种可能性;4malloc在返回的地址中引入一些随机性是相当常见的做法(可能使用
    /dev/random
    ,这是真正随机的).但他没有给我们足够的信息来确定,而且他的代码中有太多可能的未定义行为,因此很难确定。(关于许多其他问题,请参阅Dietmar的答案。)@JamesKanze有很多问题,但是像EOF这样的问题在程序的所有执行中都应该是相同的,所以在程序的多次执行中会改变的其他事情是没有正确初始化的变量,在我们的例子中,最可能的解决方案是@mareks对
    printf
    的坏期望。这是正常的t指定的
    printf
    生成不同的结果!因此解决此问题后,可能会出现其他错误,即它可以完全解决他/她的问题!这取决于o