2012-04-01 10 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(); 

} 

このコードは、バイナリファイルを読み書きするだけです。最初の部分ではファイルに書き込み、2番目の部分では同じファイルから読み込みます。読んでいる間、私は有限の時間の間、ファイルから任意のランダムなブロックを読み込もうとしていました。しかし、私はカウンタとして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

ある問題は、この行から来ている:あなた構造のサイズ88byte(* 4 22バイトのint型)であればながら

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

nodesizeは、256に等しいです。

読み込みは構造体上にメモリを書き込みます。これは他のスタック変数と同じです。

sizeof(node)は、構造体をファイルに書き込んだり読み込んだりするときに使用します。

+0

ありがとうございます!それは今働く。 – user1306082

0

あなたが達成しようとしていることは明らかにしていますが、あなたが指定したコードにはっきりしていません。

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

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

} 

したがって、pはwhileステートメントを通して-1として出力されます。 p変数を初期化するのを忘れていますか?

+0

私はちょうどpの値を変更しようとしていました。しかし、それは変化しておらず、一つの値に固定されていました。おそらく上記理由のためにcrazyjul – user1306082