C ++ файл ввода / вывода странное поведение переменной - PullRequest
0 голосов
/ 01 апреля 2012
#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 голосов
/ 01 апреля 2012

Не ясно, чего вы пытаетесь достичь, но в своем коде вы указали.

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

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

}

, поэтому p будет печататься как -1 на протяжении всего оператора while.Вы забыли инициализировать переменную p?

0 голосов
/ 01 апреля 2012

Проблема возникает из этой строки:

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

nodesize равно 256, а размер структуры равен 88 байтам (22 * 4 байта int).

Чтение - запись в памятьповерх структуры, которая оказывается другими переменными стека.

Используйте sizeof( node ), когда вы оба пишете и читаете структуру в файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...