С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
HaveMono
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 29
#1

Удаление записи из бинарного файла - C++

29.04.2014, 20:59. Просмотров 1038. Ответов 8
Метки нет (Все метки)

Добрый вечер!
У меня проблема не могу удалить из структуры.

Добавление и считывание из бинарного файла я сделал.
Удаление не получаеться.
Как я понял необходимо открыть файл на запись, затем записать по новой всех кроме удаляемого.
У меня получился бред.


2 часа искал информацию, так и не смог разобраться.
Помогите с функцией void Remove()

Вот мой код!
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
struct Student{
    char Name [20];
    char Surname [20];
    float Age;
};
 
void See();
void Add_new();
void Remove();
 
int main()
{ 
    int c;
    do
    {
system("cls"); 
cout<<" Menu:\n";
cout<<" 1.View data\n";
cout<<" 2.Add new data\n";
cout<<" 3.Remove data\n";
cout<<" 4.Exit\n";
cin>>c;
    switch (c) 
 {
    case 1: 
    system("cls"); 
    See();
    break; 
 
    case 2:
    system("cls"); 
    Add_new();
    break; 
 
    case 3:
    system("cls");
    Remove();
    break; 
  
 system("Pause");
 return 0; 
    }
}
while (c<4); 
cout<<"Bye Bye!";
system("Pause");
return 0;    
}
 
 
void Add_new()
{
cout<<"Enter number of Student> ";
int n;
cin>>n;
Student * Students= new Student[n];
for(int i=0; i<n; i++)
{
cout<<"[Student: "<<i+1<<"] "<<endl;
cout<<"\t1.Name: ";
cin>>Students[i].Name;
cout<<"\t2.Surname ";
cin>>Students[i].Surname;
cout<<"\t3.Age: ";
cin>>Students[i].Age;
}
ofstream fo("Students.txt", ios::app|ios::binary);
if(!fo)
fo.open("Students.txt", ios::out|ios::binary);
for(int i=0; i<n; i++)
fo.write((char*)&Students[i], sizeof(Student));
cout<<"All information has been written in file Students.txt\n\n";
fo.close();
}
void See()
{
ifstream fi("Students.txt", ios::binary);
if(!fi) cout<<"Error with file\n";
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Student);
Student * Students_1= new Student[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Students_1,sizeof(Student)*size);
for(int i=0; i<size; i++)
cout<<"----------------[Student "<<i+1<<"]\n"<<"Name:"<<Students_1[i].Name<<"\nSurname:"<< Students_1[i].Surname<<"\nAge:"<< Students_1[i].Age<<"\n";
}
system("Pause");
 
}
void Remove()
{   
    int del;
    cout<<"Enter the number(remove)\n";
    cin>>del;
    Student * Students= new Student[del];
 
    ofstream fo("Students.txt", ios::app|ios::binary);
if(!fo)
fo.open("Students.txt", ios::out|ios::binary);
for(int i=0; i<del; i++)
    if(i!=del)
fo.write((char*)&Students[i], sizeof(Student));
cout<<"All information has been written in file Students.txt\n\n";
fo.close();
 
}
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.04.2014, 20:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Удаление записи из бинарного файла (C++):

Удаление записи из бинарного файла - C++
Задача - удалить запись из бинарного запись по имени find находит запись, которую нужно удалить cur - текущая позиция del - удаляемая...

Удаление бинарного файла - C++
Доброго времени суток! Не могу удалить файл &quot;prile.dat&quot;. Смысл функции &quot;find_and_change&quot; в том, чтобы скопировать часть содержимого из...

Удаление записей из бинарного файла - C++
Столкнулась со следующей проблемой. В задании необходимо записать и считывать данные о структуре из бинарного файла и удалить все записи,...

Редактирование записи бинарного файла - C++
Здравствуйте. Подскажите пожалуйста, мне надо призвести редактирование записи в файле, данные в файл заношу через структуру: struct TZap{...

Сортировка\редактирование\удаление бинарного файла - C++
Люди помогите пожалуйста... В бинарном файле у меня находятся сведения о нуждающихся в пособии. Имеются функции создания\откртия файла,...

Ошибка при удаление из бинарного файла - C++
Нужно удалить из бинарного файла, содержащего информацию о студентах, определённого человека. Но когда выполняется процедура, выдаёт:...

8
zss
Модератор
Эксперт С++
6579 / 6141 / 2023
Регистрация: 18.12.2011
Сообщений: 16,006
Завершенные тесты: 1
29.04.2014, 21:24 #2
строка 106
Цитата Сообщение от HaveMono Посмотреть сообщение
for(int i=0; i<del; i++)
Надо
C++
1
for(int i=0; i<size; i++)
1
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.04.2014, 22:02 #3
В Remove(), вообще, непонятно, что делается. Из пустого массива - в файл.
0
HaveMono
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 29
29.04.2014, 23:17  [ТС] #4
необходимо определить "size". То есть необходимо считать массив из файла?

C++
1
2
3
4
5
6
7
8
ifstream fi("Students.txt", ios::binary);
if(!fi) cout<<"Error with file\n";
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Student);
Student * Students_1= new Student[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Students_1,sizeof(Student)*size);
Но у меня не удаляет. А записывает в два раза больше(записывает мусор)!
Извиняюсь если что то делаю не так.
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.04.2014, 23:52 #5
Цитата Сообщение от HaveMono Посмотреть сообщение
Но у меня не удаляет. А записывает в два раза больше(записывает мусор)!
Код показывайте.
0
HaveMono
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 29
30.04.2014, 14:16  [ТС] #6
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
void Remove()
{   
    int del;
    cout<<"Enter the number(remove)\n";
    cin>>del;
 
    for(int i=0;i<del; i++)
    if(i=del);
    {
ifstream fi("Students.txt", ios::binary);
if(!fi) cout<<"Error with file\n";
else {fi. seekg(0,ios::end);
int size=fi.tellg();
size=size/sizeof(Student);
Student * Students_1= new Student[size];
fi.seekg(0, ios::beg);
fi.read ((char*)Students_1,sizeof(Student)*size);
 
 
    ofstream fo("Students.txt", ios::app|ios::binary);
if(!fo)
fo.open("Students.txt", ios::out|ios::binary);
for(int i=0; i<size; i++)
    if(i!=del)
fo.write((char*)&Students_1[del], sizeof(Student));
cout<<"All information has been written in file Students.txt\n\n";
fo.close();
}
    
}}
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.04.2014, 14:33 #7
Цитата Сообщение от HaveMono Посмотреть сообщение
if(i=del);
Это не сравнение, и точку с запятой уберите.

Добавлено через 7 минут
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
void Remove()
{   
    int del;
    cout << "Enter the number(remove)\n";
    cin >> del;
    
    ifstream fi("Students.txt", ios::binary);
    if(!fi) 
        cout<<"Error with file\n";
    else 
    {
        fi. seekg(0,ios::end);
        int size=fi.tellg();
        size=size/sizeof(Student);
        Student * Students_1= new Student[size];
        fi.seekg(0, ios::beg);
        fi.read ((char*)Students_1,sizeof(Student)*size);
        fi.close();
 
        ofstream fo("Students.txt", ios::binary);
        for(int i = 0; i < size; i++)
        {
            if(i != del)
                fo.write((char*)&Students_1[i], sizeof(Student));
            cout<<"All information has been written in file Students.txt\n\n";
            fo.close();
        }
    }
}
1
HaveMono
1 / 1 / 0
Регистрация: 29.04.2014
Сообщений: 29
01.05.2014, 16:39  [ТС] #8
Напирмер:
Ввёл данные
Name:1 Surname:1 Age:1
Name:2 Surname:2 Age:2
....
....
Name:6 Surname:6 Age:6

При удалении выбрал(4)


Остался только(1)
Name:1 Surname:1 Age:1 (при просмотре данных)

Как это сиправить? Что бы остались
Name:1 Surname:1 Age:1
Name:2 Surname:2 Age:2
....
(без 4)
....
Name:6 Surname:6 Age:6
0
alsav22
5428 / 4823 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
01.05.2014, 17:10 #9
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Скобку не там поставил:
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
void Remove()
{   
    int del;
    cout << "Enter the number(remove)\n";
    cin >> del;
    
    ifstream fi("Students.txt", ios::binary);
    if(!fi) 
        cout<<"Error with file\n";
    else 
    {
        fi. seekg(0,ios::end);
        int size=fi.tellg();
        size=size/sizeof(Student);
        Student * Students_1= new Student[size];
        fi.seekg(0, ios::beg);
        fi.read ((char*)Students_1,sizeof(Student)*size);
        fi.close();
 
        ofstream fo("Students.txt", ios::binary);
        for(int i = 0; i < size; i++)
        {
            if(i != del)
                fo.write((char*)&Students_1[i], sizeof(Student));
        }
        cout<<"All information has been written in file Students.txt\n\n";
        fo.close();
     }
}
1
01.05.2014, 17:10
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.05.2014, 17:10
Привет! Вот еще темы с ответами:

Ошибка при чтении/записи из бинарного файла - C++
Сделал простую программу для работы с бинарными файлами, но когда запускаю ее вылетает ошибка. Сделать проще уже некуда, в чем проблема? ...

При записи в начало бинарного файла удаляется все его содержимое - C++
Есть бинарный файл, в котором в самом начале 2 байта отделены для значения int, а далее идут структуры. Нужно сменить это значение int в...

Удаление записи из файла - C++
Здравствуйте. Помогите пожалуйста над задачей, которую я не смог написать. Нужно удалить запись из файла, я понимаю, что нужно записывать...

Удаление файла записи - C++
Подскажите пожалуйста функцию удаления файла .txt


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.