Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 04.03.2020
Сообщений: 30

копирование связных списков через файл

31.03.2023, 22:42. Показов 552. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Решаю задачу. Создать и заполнить связный список (через объект класса), сохранить в файл, потом прочитать уже другим объектом (списком то бишь) и вывести. Емеет некую менюшку с выбором действия. Сделал все по тз задачи и теми инструментами, которые даны, но... Все работает, но после прочтения и вывода второго объекта выдает нужные данные + "-8421500451". Как понял, обращается к неинициализированной памяти. То ли я где-то ignore не вставил, то ли с шагами по списку напортачил, но понять не могу. Ниже код. Если есть идеи, буду признателен.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
#include<iostream>
#include<fstream>
 
using namespace std;
 
struct link
{
    int data;
    link* next;
};
class Linklist
{
private:
    link* first;
    static fstream ab;
public:
    Linklist() { first = nullptr; }
    ~Linklist()
    {
        link* del;
        while (first != nullptr)
        {
            del = first; delete del; first = first->next;
        }
        delete first;
    }
    void putd(int a)//добавляем в конец чтобы выводить в том же порядке, как вводили
    {
        link* nlink = new link;
        nlink->data = a;
        nlink->next = nullptr;
        if (first == nullptr)
        {
            first = nlink;
        }
        else
        {
            link* cur = first;
            while (cur->next != nullptr)
            {
                cur = cur->next;
            }
            cur->next = nlink;
        }
    }
 
    void getd()//вывод данных объекта
    {
        link* op = first;
        while (op != nullptr)
        {
            cout << op->data << endl;
            op = op->next;
        }
 
    }
    void wr()//записать объект в файл
    {
        ab.open("12.8.txt", ios::out | ios::in | ios::app);
        link* op = first;
        while (op != nullptr)
        {
            ab << op->data << '\n';
            op = op->next;
        }
    }
    void re()///прочитать из файла
    {
        ab.seekg(0, ios::beg);
        ab.setf(ios::skipws);
        while (!ab.eof())
        {
            link* nlink = new link;
            ab >> nlink->data;
            // cin.ignore(3, '\n');
            nlink->next = nullptr;
            if (first == nullptr)
            {
                first = nlink;
            }
            else
            {
                link* cur = first;
                while (cur->next != nullptr)
                {
                    cur = cur->next;
                }
                cur->next = nlink;
            }
        }
    }
    void sbr()//после работы программы очистить файл
    {
        ab.close();
        ab.open("12.8.txt", ios::out | ios::trunc);
        ab.close();
    }
};
 
fstream Linklist::ab;
int main()
{
    setlocale(LC_ALL, "Russian");
    Linklist a;// объект первый, сюда вводим данные
    Linklist b;//объект второй. В него будем читать
    char re;
    int ch = 0;//переменная выбора действия в меню
    do
    {
        cout
            << "введите действие от 1 до 4" << endl
            << "1.запомнить целое число" << endl
            << "2.вывести запомненные числа" << endl
            << "3.записать данные в файл" << endl
            << "4.считать данные из файла" << endl;
        cin >> ch;
 
        if (ch != 1 && ch != 2 && ch != 3 && ch != 4) continue;
        switch (ch)
        {
        case 1: cout << "число? " << endl; int y; cin >> y; a.putd(y); break;//выбрали ввести - вводим данные
        case 2: cout << "a(1) или b(2)?" << endl;//выбрали вывести данные-спрашиваем, какого объекта
            int t; cin >> t;
            cin.ignore(1, '\n');
            switch (t)
            {
            case 1: a.getd(); break;
            case 2: b.getd(); break;
            default: cout << "ошибка" << endl; break;
            }//break;
        case 3: a.wr(); break;//выбрали записать - пишем в объект первый
        case 4: b.re();  break;//выбрали прочитать - читаем в объект второй
        } //cin.ignore(1, '\n');
        cout << "ещë? y/n" << endl;
        cin >> re;
        if (re != 'n' && re != 'y') { cout << "error" << endl; }
    } while (re != 'n');
    b.sbr();//чистим файл
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
31.03.2023, 22:42
Ответы с готовыми решениями:

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

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

Исследование связных списков данных
Пусть дан список студентов. Элемент списка содержит: фамилию, имя, отчество, № курса, № группы, оценки по пяти экзаменам последней сессии....

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
31.03.2023, 22:55
Отладчик.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.03.2023, 23:35
Лучший ответ Сообщение было отмечено Valdemarych как решение

Решение

Цитата Сообщение от Valdemarych Посмотреть сообщение
Если есть идеи
Цитата Сообщение от Valdemarych Посмотреть сообщение
C++
21
22
23
24
        while (first != nullptr)
        {
            del = first; delete del; first = first->next;
        }
1.
В деструкторе ошибка :
- del указывает туда же куда и first
- удаляем элемент по del(он же first)
- пытаемся разименовать first (он же del)

2.
Цитата Сообщение от Valdemarych Посмотреть сообщение
C++
71
while (!ab.eof())
Нельзя так читать. Скорее всего у вас из-за этого и появляется доп. пустой узел.
При считывании из файла последний элемент читается дважды

Что творится в main - не смотрел.
1
0 / 0 / 0
Регистрация: 04.03.2020
Сообщений: 30
04.04.2023, 14:43  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
2.
Сообщение от Valdemarych
C++Выделить код
71
while (!ab.eof())
Нельзя так читать. Скорее всего у вас из-за этого и появляется доп. пустой узел.
При считывании из файла последний элемент читается дважды
Что творится в main - не смотрел.
разобрался спасибо! Себе для закрепления опишу: Флаг eof устанавливается после последнего "неудачного" обращения. У меня же после установки флага, но до выхода из цикла он еще раз делает вывод, а данных там уже нет.

Добавлено через 1 минуту
Цитата Сообщение от SmallEvil Посмотреть сообщение
C++Выделить код

C++
1
2
3
4
        while (first != nullptr)
        {
            del = first; delete del; first = first->next;
        }
1.
В деструкторе ошибка :
- del указывает туда же куда и first
- удаляем элемент по del(он же first)
- пытаемся разименовать first (он же del)
хотел почистить список. может, тогда изменить порядок, к примеру:

C++
1
2
3
4
        while (first != nullptr)
        {
            del = first; first = first->next; delete del;
        }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2023, 14:43
Помогаю со студенческими работами здесь

Представление графов с помощью связных списков
Здравствуйте уважаемые форумчане. Помогите мне пожалуйста. Никак не могу понять как представить граф с помощью связанных списков. Я так...

Объединение двух связных списков с объектами одного типа
Здравствуйте. При изучении связных списков, написал шаблон для связного списка, с функциями добавления и удаления с начала и конца списка....

Конструктор копирования и оператор присваивания для связных списков
Здравствуйте. Мне нужна помощь с конструктором копирования и оператором присваивания для двусвязного списка. У меня есть класс строки,...

Быстрая сортировка (сортировка Хоара) для связных списков
есть у кого готовый алгоритм? или подскажите как реализовать

Создание связных списков
Подскажите как написать программу, которая обычный список трансформирует в связный. def list_to_linkedlist(lst): # какая-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru