2012-04-01 65 views
0
#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。我使用调试器来跟踪它的变化。显然,它在读取语句执行后会改变。有人可以帮助我吗?上述程序的输出是这个C++文件输入/输出变量的奇怪行为

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 

回答

0

的问题来自于这一行:

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

nodesize等于256,而你结构的大小,如果88byte(22 * 4个字节INT)。

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

使用sizeof(node)当你写入和读取结构到文件。

+0

谢谢!它现在有效。 – user1306082 2012-04-01 09:28:42

0

不清楚你想达到什么,而是在你指定的代码中。

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

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

} 

因此,p将通过while语句打印为-1。你忘记初始化p变量了吗?

+0

我只是想改变p的值。但它并没有改变,并被固定为一个值。可能是由于crazyjul给出的上述原因 – user1306082 2012-04-01 09:50:45