0 / 0 / 0
Регистрация: 17.02.2018
Сообщений: 15
1

Удаление первого элемента из двоичного файла

30.03.2018, 21:49. Показов 1679. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Есть двоичный файл, в нем находится список. Список заполняется из консоли, вот соответсвующая структура
C++
1
2
3
4
5
6
7
8
typedef
    struct Book
    {
        char name[20];
        float prc;
        int tur;
        int Next;
    } TBook;
Задание - удалить любой элемент из списка. Написал эту функцию, но ее нужно доработать немного, вот она
Кликните здесь для просмотра всего текста

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
void delEl(FILE *&f, int &Start, char key[], char fname[15]){
    TBook wp,pp;
    int iwp = Start,ipp = -1;
        while(iwp != -1)
        {
            fseek(f,iwp,SEEK_SET);
            fread(&wp,sizeof(TBook),1,f);
            if(strcmp(key,wp.name) == 0) break;
            pp = wp;
            ipp = iwp;
            iwp = wp.Next;
        }
        if(ipp == -1 && wp.Next == -1){
        fclose(f);
            remove(fname);
            f = openFile(fname, Start);
        }
        else if(ipp == -1){
            pp = wp;
            ipp = iwp;
            iwp = wp.Next;
            fseek(f,iwp,SEEK_SET);
            fread(&wp,sizeof(TBook),1,f);
 
            fseek(f,ipp,SEEK_SET);
            fwrite(&wp,sizeof(TBook),1,f);
            deleteFromFile(f,iwp);
        }
        else{ pp.Next = wp.Next;
        fseek(f,ipp,SEEK_SET);
        fwrite(&pp,sizeof(TBook),1,f);
        deleteFromFile(f,iwp); //Освобождение физического места в файле после удаления элемента из списка
        }
}

Но мне нужно не удалять файл, когда один единственный элемент остался, а удалить этот элемент, т.к. в файле находится еще несколько списокв. Сколько пытался сделать, всегда выводило мусор.
Вот еще функция deleteFromFile(), если нужно
Кликните здесь для просмотра всего текста

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void deleteFromFile(FILE *&f,int delPos){
    TBook book;
    // читаем заголовок списка дыр из файла
      rewind(f);
      fread(&book,sizeof(TBook),1,f);
        // в прочитанном заголовке в поле Next  находится адрес первой дыры
        // теперь эта дыра будет второй, значит то, что записано в поле Next
        // заголовочной записи, записываем в поле next новой дыры, теперь она
        // первая. Надписываем не отдельно значение поля Next, а полностью
        //запись, так как информация в дырах для нас не важна
      fseek(f,delPos,SEEK_SET);
      fwrite(&book,sizeof(TBook),1,f);
        // Изменяем поле Next заголовочной записи, теперь в нем адрес вновь
        //добавленной дыры
      book.Next=delPos;
      rewind(f);
      fwrite(&book,sizeof(TBook),1,f);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.03.2018, 21:49
Ответы с готовыми решениями:

Удаление элемента из двоичного дерева
Хочу окончательно завершить тему двоичное дерево и перейти к более сложным деревьям. Однако, не...

Удаление элемента из двоичного бинарного дерева поиска
Здравствуйте! Подскажите пожалуйста, как удалить элемент из двоичного бинарного дерева поиска,...

Удаление первого элемента списка
Ребят помогите,пожалуйста. Суть в том,что нужно составить список(записную книжку) с фамилиями...

Удаление первого элемента из списка
Нужно удалить 1-ый элемент списка. #include <stdio.h> #include <stdlib.h> #include...

8
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,648
31.03.2018, 07:58 2
Формат файла какой?
0
0 / 0 / 0
Регистрация: 17.02.2018
Сообщений: 15
31.03.2018, 08:15  [ТС] 3
Я его создаю через fopen(fname, "w+b")
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,648
31.03.2018, 09:59 4
Формат данных какой? Что там за списки, как они хранятся?
0
0 / 0 / 0
Регистрация: 17.02.2018
Сообщений: 15
31.03.2018, 10:22  [ТС] 5
В двоичном файле размещены однонаправленые связаные списки, в бинарном формате, хранятся в папке с проектом
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,648
31.03.2018, 11:47 6
Разные списки? И как они там расположены? Друг за другом? Как ты их выделяешь? Функция для определения длины есть? Вот её и используй.
0
0 / 0 / 0
Регистрация: 17.02.2018
Сообщений: 15
31.03.2018, 12:06  [ТС] 7
Суть не в количестве списков, даже если и один, то если в нем находится один элемент, и нам его нужно удалить, нужно не удалять файл и создавать его заново, а убрать этот элемент, сейчас у меня это так реализовано
C++
1
2
3
4
5
if(ipp == -1 && wp.Next == -1){
        fclose(f);
            remove(fname);
            f = openFile(fname, Start);
        }
Так я удаляю первый элемент, если в списке 2 и больше элементов
C++
1
2
3
4
5
6
7
8
9
10
11
if(ipp == -1){
            pp = wp;
            ipp = iwp;
            iwp = wp.Next;
            fseek(f,iwp,SEEK_SET);
            fread(&wp,sizeof(TBook),1,f);
 
            fseek(f,ipp,SEEK_SET);
            fwrite(&wp,sizeof(TBook),1,f);
            deleteFromFile(f,iwp);
        }
Но для удаление единственного элемента это не подходит, выводит мусор
0
7787 / 6555 / 2983
Регистрация: 14.04.2014
Сообщений: 28,648
31.03.2018, 16:24 8
Цитата Сообщение от oleg525252 Посмотреть сообщение
нужно не удалять файл и создавать его заново, а убрать этот элемент
И в чём разница? У тебя при удалении файл не становится короче, что ли? Тогда как хранится информация? В третий раз спрашиваю.
0
0 / 0 / 0
Регистрация: 17.02.2018
Сообщений: 15
31.03.2018, 17:30  [ТС] 9
В описании к заданию такой информации нет, нужно через функцию deleteFromFile(освобождение физического места в файле после удаления элемента из списка) удалить элемент. Я пробовал в нее передавать адрес первого элемента
(и если он один в списке), но выводит мусор, изменял удаление первого элемента, если в списке он не один, но без результата. Думаю, нужно какие-то действия по записи связанные с первым элементом сделать, но не получается
0
31.03.2018, 17:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.03.2018, 17:30
Помогаю со студенческими работами здесь

Список. Удаление первого элемента
вообщем вроде написал правильно, но при запуске, с установленными параметрами для удаления первого...

Удаление первого элемента односвязного списка
Здравствуйте!Написана программа для работы с односвязным списком,все хорошо,но нет удаление первого...

Удаление первого элемента односвязного списка
не могу понять как удалить первый элемент в односвязном списке. #include <iostream> using...

Односвязные списки. Удаление первого элемента
Помогите пожалуйста. Почему срабатывает точка останова на free(p) ? CAR* remove_begin(CAR* p) {...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru