我定义了一些复杂的结构并测试了 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] 是对的,
所以我正在消费。