写入和读取bin文件数据不对

时间:2013-11-14 02:47:37

标签: c++ file bin

我定义了一个复杂的结构并测试了c ++ io的写/读。

但是我可能使用io读写是不对的,所以我没有得到我想要的结果,我想可能ifstrream读取方法我使用的方式是不对的,期待有人帮助解决它。

LNode结构是这样的:

struct LNode
{
    int data;
    LNode *next;
};

我用来处理io的代码在这里:

LNode *tmp;
tmp = NULL;

LinkList l = L->next;

ofstream myfile_tom("struct.dat", ios::out | ios::binary);

while ( l ){

    tmp = l;
    cout<<tmp->data<<endl;
    myfile_tom.seekp(0);
    myfile_tom.write((char*)tmp, sizeof (LNode) );

    l = l->next;

}
cout<<"write end\n";


//closing file
myfile_tom.close();

// read and write methods accept a char* pointer

// read code
LNode *y = new LNode[5];

ifstream myfile ("struct.dat", ios::in  | ios::binary |  ios::ate );
myfile.seekg(0);
myfile.read((char*)y, sizeof(LNode) * 5);


(LNode *)y;

// test if read successful
cout<< "test"<< endl;
cout<<"y[0].data"<<y[0].data<<endl;
cout<<"y[1].data"<<y[1].data<<endl;
cout<<"y[2].data"<<y[2].data<<endl;
cout<<"y[3].data"<<y[3].data<<endl;
cout<<"y[4].data"<<y[4].data<<endl;
//

myfile.close();

其中L是LinkList,我使用“1,2,3,4,5;

初始化它
typedef LNode *LinkList;

int p;

int status;
status = InitList( L );

for ( p=1; p <= 5; p++) 
    status = ListInsert(L, 1, p);

背景所需的所有定义如下:

int InitList(LinkList &L)
{ 
    L = (LinkList)malloc(sizeof(struct LNode)); 
    if(!L) 
        exit(OVERFLOW);
    L->next=NULL; 
    return 1;
}

int ListInsert(LinkList L, int i, int element) {
//
    int j = 0;
    LinkList p = L, s;

    while( p&&j<i-1)
    {
        p = p->next;
        j++;
    }

    if (!p||j>i-1 )
        return 0;

    s = (LinkList)malloc(sizeof(LNode));
    s->data = element;
    s->next = p->next;
    p->next = s;
    return 1;

}

void visit( int c ) // 
{
    printf("%d ",c);
}

int ListTraverse( LinkList L , void (*vi)(int)){

    LinkList p = L->next;
    while ( p ) {
        vi(p->data);
        p = p->next;
    }
    printf("\n");
    return 1;
}

我的程序输出是:

after insert at the LinkList L's head insert 1~5:L=
5 4 3 2 1
5
4
3
2
1
write end
test
y[0].data1
y[1].data-842150451
y[2].data-842150451
y[3].data-842150451
y[4].data-842150451

只是y [0]是对的,

所以我正在消费。

1 个答案:

答案 0 :(得分:1)

您的代码将整个LNode存储到文件中,并包含next指针。但是,指针是动态的东西,代表内存中的当前地址。存储它们是没有意义的。

如果您只是尝试存储数据,然后重建具有相同数据的链表,那么您的初始写循环应该只写出数据字段而不是next指针。稍后,当您读入数据时,应该分配新结构并在代码中建立next指针,并在分配结构后将数据读入其他字段。

所有这一切,如果出于“错误的原因”,您的代码似乎仍应正常运行。我怀疑你的循环中存在真正的错误seekp,这会导致你一遍又一遍地覆盖文件的前面部分:

myfile_tom.seekp(0);