Некорректное чтение данных из файла

219
26 июня 2018, 22:10

Ввожу и считываю данные этим кодом

#include "stdafx.h"
#include "iostream"
#include <fstream>
#include <windows.h>
using namespace std;
struct Node{
    int n;
    char f[8];
};
struct List{
    Node *head;
    Node *tail;
    int count;
};
void addNode(List *L){
    Node *temp;
    temp = new Node;
    cout << endl << "Введите число: ";
    cin >> temp->n;
    cout << endl << "Введите f: ";
    char Lol[8];
    cin >> Lol;
    strcpy_s(temp->f, Lol);
    if(L->head != NULL){
        L->tail = L->head;
        L->head = temp;
    } else {
        L->head = temp;
    }
    L->count++;
}
void insertNode(List * L, Node * N){
    if(L->head != NULL){
        L->tail = L->head;
        L->head = N;
    } else {
        L->head = N;
    }
    L->count++;
}
void createList(List *L){
    L->count = 0;
    L->head=L->tail=NULL;
}
int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    string path = "file.txt";
    ifstream fin;
    fin.open(path);
    if(!fin.is_open()){
        cout << endl << "Ввод данных: " << endl;
        List L;
        createList(&L);
        addNode(&L);
        addNode(&L);
        ofstream fout;
        fout.open(path, ios::app);
        if(!fout.is_open()) cout << "GLOBAL ERROR!" << endl;
        else {
            cout << "Новые данные успешно сохранены!" << endl;
            fout.write((char*)&L, sizeof(List));
            cout << endl << L.count << endl;
            for(int i = 0; i < L.count; i++){
                Node * N = new Node;
                fout.write((char*)N, sizeof(Node));
            }
        }
        fout.close();
    } else {
        cout << "Файл открыт!" << endl;
        List Ls;
        fin.read((char*)&Ls, sizeof(List));
        int count = Ls.count;
        createList(&Ls);
        for(int i = 0; i < count; i++){
            Node * Nd = new Node;
            fin.read((char*)Nd, sizeof(Node));
            cout << Nd->n << "\t" << Nd->f << endl;
            insertNode(&Ls, Nd);
        }
        cout << endl << "Успешно выгружено!" << endl;
        if(Ls.head != NULL) cout << endl << Ls.head->f << "\t" << Ls.tail->f << endl;
        else {
            cout << "NULL \tcount = " << count << endl;
        }
    }
    fin.close();
    system("pause");
    return 0;
}

Здесь мы задаем 2 структуры Node, которые в последствие впихиваем в структуру List

При чтении данных получается непонятно. Данные структуры List, т.е. count передается как надо, в отличие от данных структуры Node, они выглядят непонятно как

В чем ошибка?

Answer 1

Вместо заполненных нод вы пытаетесь писать в файл куски неинициализированной памяти, что приводит к неопределенному поведениюЖ

Node * N = new Node;
fout.write((char*)N, sizeof(Node));

Еще перед этим вы пишите в файл структуру с указателями, которые протухают и не могут быть использованы после чтения из файла в другом процессе.

fout.write((char*)&L, sizeof(List));

И память утекает стремительным потоком...

READ ALSO
Правка кода поиска мостов в графе

Правка кода поиска мостов в графе

Написал граф через классы на списку смежностиПомогите написать корректный алгоритм поиска мостов

192
Бесконечный скролл фона

Бесконечный скролл фона

Как можно сделать бесконечный скролл фона при этом не теряя гибкости процентных величин?

175
Два блока рядом, разные по высоте

Два блока рядом, разные по высоте

Есть ли в этом случае возможность выровнять <span class = "b"> по высоте как auto?

170
Как вывести данные по ключу объектов?

Как вывести данные по ключу объектов?

Есть массив объектовНужно сделать вывод данных по ключу со всех объектов, дело в том, что ключ который вводишь есть, значение у ключа тоже...

190