записывать и читать данные бинарного файла не правильно

я определяю немного сложную структуру и тестирую запись / чтение c ++ io.

но, возможно, мое использование io для чтения и записи неправильно, поэтому я не получаю желаемый результат, я думаю, что метод чтения ifstrream, который я использую способом, не подходит, ожидайте, что кто-нибудь поможет разобраться в этом.

структура LNode выглядит следующим образом:

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

код, который я использую для обработки ввода-вывода здесь:

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

Просто у [0] верно,

так что я потребляю

0

Решение

Ваш код хранит весь LNode в файл, и это включает в себя next указатель. Но указатели — это динамические вещи, представляющие текущие адреса в памяти. Нет смысла хранить их.

Если вы просто пытаетесь сохранить данные, а затем восстанавливать связанный список с теми же данными, ваш начальный цикл записи должен просто записывать поля данных, а не next указатели. Позже, когда вы читаете данные, вы должны выделить новые структуры и установить next указатели в коде и считывание данных в другие поля после выделения структур.

Все это говорит о том, что ваш код по-прежнему должен работать правильно, если по «неправильным причинам». Я подозреваю, что настоящая ошибка заключается в следующем seekp в вашем цикле, который заставляет вас перезаписывать переднюю часть файла снова и снова:

myfile_tom.seekp(0);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]