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

Структра, функция удаление

12.03.2017, 21:21. Показов 544. Ответов 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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
void DeleteArchive()
{
    unsigned int next;
    if (!SignArchive)
    {
        cout << "\n Архив не создан\n";
        cout << "Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        cin.get();
        return;
    }
    cout <<"Прочитаем  файл для удаления архива\n";
    cout <<"Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    inFileBin.open("Arch.bin", ios::app | ios::binary);
    if (!inFileBin) errorF("Arch.bin");
    int i = 0;
    while (1)
    {
        InElement(inFileBin, sp1[i]);
        //Проверка следжующего символа.
        next = inFileBin.peek();
        if (next == EOF)break;
        i++;//v1.push_back(Elem);
    }
    nSp1 = i;
    inFileBin.close();
    cin.get();//Очищает поток cin.
    outFileBin.open("Arch.bin", ios::app | ios::binary);//Открываем бинарный файл для добавления в конец.
    if (!outFileBin) errorF("Arch.bin");
    cout << "Введите номер строки для удаления :" << std::endl;
    int i_number_line_delete;
    cin >> i_number_line_delete;
    cout << endl;
    cout << "Идет удаление строки...." << endl;
    for (int i = i_number_line_delete; i<nSp1; i++)
    {
        OutElementCon(sp1[i+1]);
        outFileBin.write((char *)&sp1[i], sizeof sp1[i]);
        i++;
    }
    cout << "-------------------------------------------- " << endl;
    outFileBin.close();
    cout << "\nДля выхода из режима нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    
}
полная прога:
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
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
//Программа записывает массив структур в текстовый и бинарный файлы.
#include<stdio.h>//Функции стандартного в/в СИ.
#include<stdlib.h>
#include<fstream>//Потоковый ввод-вывод с файлами
#include<iostream>//Описывает методы ввода-вывода в консоль cin, cout. 
#include<math.h>
#include<windows.h>
#include <tchar.h>
#include <string.h>
#include <string>
#include <vector> //класc контейнера vector.
 
using namespace std;//Пространство имен std.
//vector<char*> fileBuf;
struct Elektronnie_pribori
{
    char NameEP[35];
    double Cena;
    int God_vipuska;
};
ifstream inFileTxt,inFileBin;//Потоки ввода и вывода в текстовые и бинарные файлы
ofstream outFileTxt,outFileBin;// описал как глобальные переменные.
Elektronnie_pribori sp[100], sp1[10];
int nSp,nSp1;
Elektronnie_pribori Elem;
int SignArchive=0;
void errorF(char *FileName)//Функция печати сообщения об ошибке открытия файла.
{
    cerr << "\nОшибка открытия файла "<<' ' << FileName << '\n';
    cout<<"Для завершения нажмите ENTER.\n";
    cin.get();
    cin.get();//Останов до нажатия символьной клавиши.
    //cin.get();//При первом срабатывании в буфере бывает лишний символ.
    exit(1);
}
void OutElement(ofstream& out, Elektronnie_pribori& el)//Функция вывода элемента структуры в текстовый файл.
{
    out << el.NameEP << ' ' << el.Cena << ' ' << el.God_vipuska << '\n';
}
void InElement(ifstream& in, Elektronnie_pribori& el)//Функция ввода элемента структуры из текстового файла.
{
    in >> el.NameEP >> el.Cena >> el.God_vipuska;
}
void OutElementCon(Elektronnie_pribori& el)//Функция вывода элемента структуры в консоль.
{
    cout << el.NameEP << ' ' << el.Cena << ' ' << el.God_vipuska << '\n';
}
void CreateArhive();
void AddArchive();
void PrintArhive();
void DeleteArchive();
 
void main()
{   
    int nSp,nSp1;
    //unsigned int next;
    //char sourse[30];
    //vector<Apteca> v,v1;
    //Apteca Spisok[100],SpisokAdd[10];
    //Apteca Elem;
    SetConsoleOutputCP(1251);
    SetConsoleCP(1251);      
    int KeyRegime; 
 
  do
    {
    //ClrScr;
    cout << "\n      Укажите режим работы программы:";
    cout << "\n      0 - конец работы;";
    cout << "\n      1 - контроль текстовых файлов;";
    cout << "\n      +   2 - создание архива изделий;";
    cout << "\n      3 - сортировка компонент архива;";
    cout << "\n       +  4 - печать архива изделий;";
    cout << "\n      5 - печать кодификатора изделий;";
    cout << "\n      +   6 - добавление компонент в архив;";
    cout << "\n      +   7 - удаление компоненты из архива;";
    cout << "\n      8 - изменение компоненты в архиве;";
    cout << "\n      9 - обработка архива \n";
   
    cin >> KeyRegime;
        switch (KeyRegime) 
        {
            case 0 : ;                 break;
            case 1 : /*CheckFiles();*/       break;
            case 2 : CreateArhive();   break;
            case 3 : /*(SortArchive();*/    break;
            case 4 : PrintArhive();    break;
            case 5 : /*PrintKodif();*/   break;
            case 6 : AddArchive();     break;
            case 7 : DeleteArchive();  break;
            case 8 : /*ChangeArchive();*/  break;
            case 9 : /*WorkUpArchive();*/    break;
            default: KeyRegime=0;
        }
    } 
  while (KeyRegime!=0);
  cout<<"\n Работа программы завершена\n";
        cout<<"Для для выхода нажмите ENTER.\n";
        cin.get();
        cin.get();
 
}
void CreateArhive()
{
    unsigned int next;
    if(SignArchive)
    {
        cout<<"\n Архив уже создан\n";
        cout<<"Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        return;
    }
    cout <<"\n введите имя архивного текстового файла: ";
    char sourse[30];
    cin >> sourse;
    //ifstream inFile;
    inFileTxt.open(sourse);//Открываем исходный текстовый файл-архив для чтения
    if(!inFileTxt) errorF(sourse);// и подключаем его к потоку inFileTxt.
    
    cout <<"\n Выполняем чтение исходного архива\n";
    cout <<"Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    int i=0;
    while(1)
    {
        InElement(inFileTxt,sp[i]);
        //Проверка следжующего символа.
        next=inFileTxt.peek();
        if(next==EOF)break;
        i++;
        //sp.push_back(Elem);//Текущий элемент добавляем в коней вектора
    }
    nSp=i;
    inFileTxt.close();//Закрыли текстовый файл, а переменная потока сохраняется.
    cout <<"Исходный архив выводим на экран и записываем в бинарный файл\n";
    cout <<"\nДля продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    outFileBin.open("Arch.bin",ios::binary);
    if(!outFileBin) errorF("Arch.bin");
    cout << "\n-------------------------------------------- " << endl;
    cout << "Данные:" << endl;
    cout << "-------------------------------------------- " << endl;
    for(int i=0;i<nSp;i++)
    {
        OutElementCon(sp[i]);
        outFileBin.write((char *) &sp[i], sizeof sp[i]);
    }
    cout << "-------------------------------------------- " << endl;
    outFileBin.close();//Закрываем бинарный  файл архива
    //int i=v.size();
    //cout<<"\n v.size()= " << i << '\n';
    //v.clear();//Обнуляем содержимое контейнера.
    //i=v.size();
    //cout<<"\n v.size()= " << i << '\n';
    //v.clear();//Обнуляем содержимое контейнера.
    cout <<"\nДля выхода из режима нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    SignArchive=1;//Архив создан.
 
}
//-----------------начало---------------------------------------------
 
 
void DeleteArchive()
{
    unsigned int next;
    if (!SignArchive)
    {
        cout << "\n Архив не создан\n";
        cout << "Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        cin.get();
        return;
    }
    cout <<"Прочитаем  файл для удаления архива\n";
    cout <<"Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    inFileBin.open("Arch.bin", ios::app | ios::binary);
    if (!inFileBin) errorF("Arch.bin");
    int i = 0;
    while (1)
    {
        InElement(inFileBin, sp1[i]);
        //Проверка следжующего символа.
        next = inFileBin.peek();
        if (next == EOF)break;
        i++;//v1.push_back(Elem);
    }
    nSp1 = i;
    inFileBin.close();
    cin.get();//Очищает поток cin.
    outFileBin.open("Arch.bin", ios::app | ios::binary);//Открываем бинарный файл для добавления в конец.
    if (!outFileBin) errorF("Arch.bin");
    cout << "Введите номер строки для удаления :" << std::endl;
    int i_number_line_delete;
    cin >> i_number_line_delete;
    cout << endl;
    cout << "Идет удаление строки...." << endl;
    for (int i = i_number_line_delete; i<nSp1; i++)
    {
        OutElementCon(sp1[i+1]);
        outFileBin.write((char *)&sp1[i], sizeof sp1[i]);
        i++;
    }
    cout << "-------------------------------------------- " << endl;
    outFileBin.close();
    cout << "\nДля выхода из режима нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    
}
//-----------------------------------------------
//--------------------------------------------------------------
void AddArchive()
{
    unsigned int next;
    if (!SignArchive)
    {
        cout << "\n Архив не создан\n";
        cout << "Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        cin.get();
        return;
    }
    cout << "Прочитаем текстовый файл для добавления архива\n";
    cout << "Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    inFileTxt.open("ArchAdd.txt");
    if (!inFileTxt) errorF("ArchAdd.txt");
    int i = 0;
    while (1)
    {
        InElement(inFileTxt, sp1[i]);
        //Проверка следжующего символа.
        next = inFileTxt.peek();
        if (next == EOF)break;
        i++;//v1.push_back(Elem);
    }
    nSp1 = i;
    inFileTxt.close();
    cout << "Текстовый файл для добавления архива выведем на экран и добавим его в бинарный файл архива\n";
    cout << "Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    outFileBin.open("Arch.bin", ios::app | ios::binary);//Открываем бинарный файл для добавления в конец.
    if (!outFileBin) errorF("Arch.bin");
    cout << "\n-------------------------------------------- " << endl;
    cout << "Данные котоыре будут внесены к уже имеющимся:" << endl;
    cout << "-------------------------------------------- " << endl;
    for (int i = 0; i<nSp1; i++)
    {
        OutElementCon(sp1[i]);
        outFileBin.write((char *)&sp1[i], sizeof sp1[i]);
    }
    cout << "-------------------------------------------- " << endl;
    outFileBin.close();
    // i=v1.size();
    //cout<<"\n v1.size()= " << i << '\n';
    //v1.clear();//Обнуляем содержимое контейнера.
    //i=v1.size();
    //cout<<"\n v1.size()= " << i << '\n';
    cout << "\nДля выхода из режима нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
}
 
void PrintArhive()
{
    if(!SignArchive)
    {
        cout<<"\n Архив не создан\n";
        cout<<"Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        return;
    }
    cout<<"Считываем архив из бинарного файла и выведем на экран\n";
    cout<<"Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    inFileBin.open("Arch.bin",ios::binary);
    if(!inFileBin) errorF("Arch.bin");
    int i=0;
    cout << "\n-------------------------------------------- " << endl;
    cout << "Данные:" << endl;
    cout << "-------------------------------------------- " << endl;
    while(1)
    {
        inFileBin.read((char *) &sp[i], sizeof sp[i]);  
        if(!inFileBin) break;
        i++;
        //v.push_back(Elem);
    }
    nSp=i;
    inFileBin.close();
    for(int i=0;i<nSp;i++)
        OutElementCon(sp[i]);
    cout << "-------------------------------------------- " << endl;
    //int i=v.size();
    //cout<<"\n v.size()= " << i << '\n';
    //v.clear();//Обнуляем содержимое контейнера.
    //i=v.size();
    //cout<<"\n v.size()= " << i << '\n';
    cout<<"Для выхода из режима ENTER.\n";
    cin.get();//Очищает поток cin.
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.03.2017, 21:21
Ответы с готовыми решениями:

структра C++
Информация об участниках спортивных соревнований содержит наиме- нование страны, название команды, ФИО игрока, игровой номер, возраст,...

Функция: удаление из строки слова с номером М
Дан текст (2–3 строки) в файле F1. Текст состоит из слов, отделенных друг от друга пробелами. Описать функцию, удаляющую из строки слово с...

Функция: подсчёт в слове повторяющихся букв и их удаление
Определить функцию для подсчёта в слове повторяющихся букв и их удаления. Подсчитать количество повторяющихся букв пяти словах введенных с...

7
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.03.2017, 00:00
В файле-то что? Структуры?
0
1 / 1 / 1
Регистрация: 24.09.2013
Сообщений: 140
13.03.2017, 18:17  [ТС]
да в *.txt файле структура , по типу:

название1 цена год_выпуска

а в бин файл переписывается структура из файла txt
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.03.2017, 18:40
inFileBin для чего открывается в бинарном режиме, если считывается как текстовый?
И что вообще должно произойти? Ввели номер. Нужно переписать всё, кроме этой строки, или то, что после неё?
0
1 / 1 / 1
Регистрация: 24.09.2013
Сообщений: 140
14.03.2017, 16:57  [ТС]
Нужно удалить в бинарном файле определенную строку, а на ее место записать другую
Например нужно удалить строку 2, на место 2й строки нужно поставить 3ю и т.д.

я вот пытался сделать по другому но всеровно удаляет не коректно

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
void DeleteArchive()
{
    unsigned int next;
    if (!SignArchive)
    {
        cout << "\n Архив не создан\n";
        cout << "Для для выхода из режима нажмите ENTER.\n";
        cin.get();
        cin.get();
        return;
    }
    cout << "Прочитаем  файл для удаления архива\n";
    cout << "Для продолжения нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
    inFileBin.open("Arch.bin", ios::binary);
    //inFileBin.seekg(0);
    if (!inFileBin) errorF("Arch.bin");
    int i = 0;
while(1)
    {
        inFileBin.read((char *) &sp1[i], sizeof sp1[i]);  
        if(!inFileBin) break;
        i++;
        //v.push_back(Elem);
    }
    nSp1=i;
    inFileBin.close();
    cin.get();//Очищает поток cin.
    //outFileBin.open("Arch.bin", ios::binary);//Открываем бинарный файл для добавления в конец.
    //if (!outFileBin) errorF("Arch.bin");
    cout << "Введите номер строки для удаления :" << std::endl;
    int i_number_line_delete;
    cin >> i_number_line_delete;
    cout << endl;
    cout << "Идет удаление строки...." << endl;
    //outFileBin.seekp(sizeof(sp1[1])*i_number_line_delete);
    for (int i = i_number_line_delete; i<nSp1; i++)
    {    sp1[i]=sp1[i+1];
        //OutElementCon(sp1[i]);
        //outFileBin.write((char *)&sp1[i], sizeof sp1[i]);
        //i++;
    }
    nSp1=-1;
    outFileBin.open("Arch.bin", ios::binary);//Открываем бинарный файл для добавления в конец.
    if (!outFileBin) errorF("Arch.bin");
    cout << "\n-------------------------------------------- " << endl;
    cout << "Данные котоыре будут внесены к уже имеющимся:" << endl;
    cout << "-------------------------------------------- " << endl;
    for (int i = 0; i<nSp1; i++)
    {
        //OutElementCon(sp1[i]);
        outFileBin.write((char *)&sp1[i], sizeof sp1[i]);
    }
    cout << "-------------------------------------------- " << endl;
    outFileBin.close();
    cout << "\nДля выхода из режима нажмите ENTER.\n";
    cin.get();//Очищает поток cin.
 
}
посл того как вызываю функцию удадения строки все данные в файле очищаются :
0
1130 / 789 / 232
Регистрация: 12.04.2010
Сообщений: 2,012
14.03.2017, 17:57
Revolver19931, создание файла работает? Прочитать и вывести на консоль - работает?

Добавлено через 22 секунды
Цитата Сообщение от Revolver19931 Посмотреть сообщение
посл того как вызываю функцию удадения строки все данные в файле очищаются
Можно в режиме отладке, установить breakpoint в цикле чтения и посмотреть, правильно ли читает.
0
1 / 1 / 1
Регистрация: 24.09.2013
Сообщений: 140
14.03.2017, 18:22  [ТС]
Создание бинарного файла работает, вывод его в консоль тоже тоже, однако у меня удаляются все строки когда я пытаюсь записать уже массив в котором я удалил и перезаписал строки в бинарный файл у меня не перезаписывается а удаляется все.
отладкой проходил по циклу который считает кол-во строк в файле, считает правильно.
сам проект: lr4_.rar
0
1 / 1 / 1
Регистрация: 24.09.2013
Сообщений: 140
14.03.2017, 18:33  [ТС]
Нащел ошибку у себя она заключалась в
C++
1
nSp1=-1;
, а нужно было
C++
1
nSp1=nSp1-1;
. Все работает.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
14.03.2017, 18:33
Помогаю со студенческими работами здесь

Функция: удаление узла дерева со всеми потомками
подскажите код функции которая удаляет элемент дерева со всеми его потомками NODE *SEARCH(char *key, NODE *root) { NODE...

Функция (удаление элементов вектора, равных переданному значению)
Здравствуйте товарищи и С Новым Годом!!! Большую часть задания сделал, нужно еще кое что дополнить, все никак не соображу. Вообщем мне...

Функция: удаление текста внутри скобок вместе со скобками
Использую MS VS2017 , закомментируйте пожалуйста данную функцию (char* str_remove(char* s, char a, char b) ) поэтапно, ибо не удаётся её...

Функция remove: удаление всех включений элемента x из стека
реализуйте функцию remove которая удаляет все включения элемента x из стека

Функция getc() и удаление из файла всего, что было считано
Функция getc() она считывает по символьно, как сохранить этот считанный текст в переменную ? И как считанный текст удалить из файла? ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru