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

时间:2012-04-01 09:15:48

标签: c++ file input

#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();

}

此代码只是读取和写入二进制文件。在第一部分中,它写入文件,在第二部分中,它从同一文件中读取。在阅读时,我试图从文件中读取任何随机块一段有限的时间。但是当我使用p变量作为计数器时,它不起作用。它的值在第一次迭代中直接递减到-1。我使用调试器来跟踪它的变化。显然,它在执行read语句后发生了变化。有人可以帮我这个吗?上述程序的输出是

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

2 个答案:

答案 0 :(得分:0)

问题来自这一行:

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

nodesize等于256,而结构的大小为88byte(22 * 4 bytes int)。

读取是在结构上写入内存,这恰好是其他堆栈变量。

当您同时编写并读取文件结构时,请使用sizeof( node )

答案 1 :(得分:0)

不清楚您要实现的目标,但在您指定的代码中。

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

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

}

所以p将通过while语句打印为-1。你忘了初始化p变量吗?