简体   繁体   English

C ++文件输入/输出变量的奇怪行为

[英]C++ File input/output strange behavior of the variable

#include<iostream>
#include<time.h>
#include<list>
#include<stdlib.h>
#include<fstream>
using namespace std;

typedef struct diskBtNode
{
    int parent; //-1 if NULL
    //int size;
    int leaf;
    int arr[20];
};

int main()
{

    fstream myfile;
    srand(time(NULL));
    myfile.open("btree.txt",ios::in | ios::out | ios::binary | ios::trunc);
    long nodesize=256;
    long currentpos=0;
    if(myfile.fail())
    {
        std::cout<<"Error opening the file "<<std::endl;
    }
    currentpos=0;
    for(int i=0;i<10;i++)
    {
        diskBtNode node;
        node.parent=rand()%10;
        node.leaf=rand()%1;
        int n=rand()%19;
        int j;
        for(j=0;j<n;j++)
        {
            node.arr[j]=n;
        }
        node.arr[j]=-1;

        cout<<node.parent<<" "<<node.leaf<<" ";
        j=0;
        while(node.arr[j]!=-1)
        {
        cout<<node.arr[j]<<" ";
        j++;
        }
        cout<<node.arr[j]<<std::endl;

        myfile.seekp(currentpos*nodesize,ios::beg);
        myfile.write(reinterpret_cast<char *>(&node),nodesize);
        currentpos++;
//      p=p+1;
    }


    cout<<"******************* "<<std::endl;
    currentpos--;
    long  p=0;
    while(currentpos>=0)
    {
        std::cout<<currentpos<<" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& "<<p<<" "<<std::endl;
        diskBtNode node;
        myfile.seekg(currentpos*nodesize,ios::beg);
        myfile.read(reinterpret_cast<char *>(&node),nodesize);
        currentpos--;
        p--; //decrementing p
        cout<<node.parent<<" "<<node.leaf<<" ";
        int j=0;
        while(node.arr[j]!=-1)
        {
        cout<<node.arr[j]<<" ";
        j++;
        }
        cout<<node.arr[j]<<std::endl;

    }

    myfile.close();

}

This code simply reads and writes to a binary file. 此代码仅读取和写入二进制文件。 In the first part it writes to a file and in the second part it reads from the same file. 在第一部分中,它写入文件,在第二部分中,它从同一文件读取。 While reading I was trying to read any random blocks from a file for a finite number of time. 在读取时,我试图在有限的时间内读取文件中的任何随机块。 But when I am using p variable as a counter, it doesn't work. 但是当我使用p变量作为计数器时,它不起作用。 It's value is decremented in the first iteration directly to -1. 它的值在第一次迭代中直接减小为-1。 I used debugger to track where it changes. 我使用调试器来跟踪它的更改。 Apparently it changes after the read statement is executed. 显然,在执行read语句后,它会更改。 Can somebody please help me with this? 有人可以帮我吗? The output of the above program is this 上面程序的输出是这个

8 0 8 8 8 8 8 8 8 8 -1
5 0 8 8 8 8 8 8 8 8 -1
3 0 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 -1
5 0 1 -1
4 0 -1
9 0 13 13 13 13 13 13 13 13 13 13 13 13 13 -1
4 0 11 11 11 11 11 11 11 11 11 11 11 -1
6 0 6 6 6 6 6 6 -1
6 0 8 8 8 8 8 8 8 8 -1
2 0 2 2 -1
******************* 
9 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 0 
2 0 2 2 -1
8 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
6 0 8 8 8 8 8 8 8 8 -1
7 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
6 0 6 6 6 6 6 6 -1
6 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
4 0 11 11 11 11 11 11 11 11 11 11 11 -1
5 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
9 0 13 13 13 13 13 13 13 13 13 13 13 13 13 -1
4 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
4 0 -1
3 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
5 0 1 -1
2 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
3 0 15 15 15 15 15 15 15 15 15 15 15 15 15 15 15 -1
1 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
5 0 8 8 8 8 8 8 8 8 -1
0 &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& -1 
8 0 8 8 8 8 8 8 8 8 -1

The problem comes from this line : 问题来自此行:

myfile.read(reinterpret_cast<char *>(&node),nodesize);

nodesize equals 256, while you structure's size if 88byte ( 22 * 4 bytes int ). nodesize等于256,而结构大小则为88byte(22 * 4 bytes int)。

The read is writing memory over the structure, which happens to be the other stack variables. 读操作是在结构上写入内存,而该结构恰好是其他堆栈变量。

Use sizeof( node ) when you both write and read the struct to the file. 在向文件写入和读取结构时都使用sizeof( node )

Not clear what you are trying to achieve, but in your code you have specified. 不清楚要实现的目标,但是已经在代码中指定了。

long  p=0;
while(currentpos>=0)
{

....
p--; // this will make p = -1

}

so the p will print as -1 all through the while statement. 因此p在while语句中将全部打印为-1。 Are you forgetting to initialize the p variable? 您是否忘记初始化p变量?

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM