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

Удалить и переименовать файл

30.05.2018, 18:45. Показов 2559. Ответов 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
class AdminInfo {
public:
    string filename; //имя файла
};
AdminInfo* info = new AdminInfo(); //указатель
 
class FileStrategy
{
public:
    virtual ~FileStrategy() = default; //виртуальный деструктор по умолчанию
    virtual void use() = 0; //виртуальный метод,в котором буду происходить действия (стратегии)
};
/*
* Стратегия создания файла
* */
class CreateFile : public FileStrategy // CreateFile наследник FileStrategy
                                       //Делаем это для того,что бы мы могли определить методы use и деструктор(если требуется)
{
public:
    void use()override { //override - показываем,что этот метод берем из родительского класса,а не просто создаем свой
        string file;
        cout << "Введите имя файла:" << endl;
        cin >> file;
        ofstream fout(file); //создаем поток файла
        fout.close(); //закрываем
        info->filename = file; //теперь имя файла экземпляра класса равно имени файла указанному пользователем
    }
};
Тут нужно удалить
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
class deleteEntryByKey : public FileStrategy
{
public:
    void use() override {
        ofstream fout("buf.txt"); //Наш буфферный файл. Создаем его
        fout.close(); // И тут же закрываем
        string key; // ключ
        cout << "Введите ключ удаления:" << endl;
        cin >> key; //вводим ключ
        regex reg1(key, icase); //регулярныое выражение. первый аргумент - то,что будем искать , второй аргумент - флаг, режим игнорирования регистра
        ifstream f(info->filename); //Открываем поток основного файла с данными
        while (f) //пока файл существует
        {
            string str; //буфферная строка
            getline(f, str); //получаем очередную строку из файла и записываем её в буфер
            if (!regex_search(str, reg1)) { //Если найденная строка нам НЕ подходит по ключу (иными словами в ней НЕ нашелся тот ключ по которому мы удаляем)
                fout.open("buf.txt", ios::out | ios::app); //то открываем буфферный файл в режиме записи в конец
                fout << str; //и записываем строку которая сейчас в буффере строки из файла
                fout.write("\n", 1); //ну и не забываем перейти на следующую строку
            }
            remove(filename);
            fout.close(); //закрываем файл
 
        };
        /*
        * Теперь необходимо привести всё к первоначальному виду.
        * 1)Удалим файл из которого читали и удаляли по ключу
        * 2)Переименуем буфферный файл именем которое было изначально
        * */
 
    
        
 
 
        if (rename("buf.txt", info->filename.c_str()))            // переименование файла
            cout << "Файл успешно переименованn";
        else
            cout << "Ошибка переименования файлаn";
    };
};
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.05.2018, 18:45
Ответы с готовыми решениями:

fstream (удалить файл каким то методом и переименовать)
Здравствуйте. Возник вопрос. В инете ничего не нашел толкового так как английский хромой. fstream f(&quot;txt.txt&quot;,ios::in); можно...

Удалить и переименовать фаил
Уважаемые форумчане,подскажите как можно удалить и переименовать фаил?

Как переименовать файл
вот кусочек моего кода int open()//функция открытия файла { system(&quot;cls&quot;); redactor red; cout&lt;&lt;&quot;введите имя...

3
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.05.2018, 19:49
Файл же открыт. Что за цикл в 12-й строке?
0
0 / 0 / 0
Регистрация: 28.02.2018
Сообщений: 8
30.05.2018, 19:57  [ТС]
f это поток

Добавлено через 2 минуты
f это поток
вот весь код
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
#include <iostream>
#include <fstream> //файловый поток
#include <regex> //регулярные выражения
#include <string>
#include <cstdio>
using namespace std;
using namespace regex_constants; //библиотека флагов и констант ругулярных выражений (regex)
 
                                 /*
                                 * Реализация основана на паттерне проектирования "Стратегия"
                                 * Кратко:
                                 * FileStrategy - определяет, как будут использоваться различные алгоритмы
                                 * <Name>Strategy реализуют эти  алгоритмы
                                 * Класс Context использует конкретные классы <Name>Strategy посредством ссылки на конкретный
                                 * тип абстрактного класса FileStrategy. Классы FileStrategy и Context взаимодействуют с целью реализации
                                 * выбранного алгоритма
                                 * Класс Context пересылает классу Strategy запрос, поступивший от его класса-клиента.
                                 * Всё проще,если заглянуть в код.
                                 * */
 
                                 //Информация о файле,как бы информация администратора
class AdminInfo {
public:
    string filename; //имя файла
};
AdminInfo* info = new AdminInfo(); //указатель
 
class FileStrategy
{
public:
    virtual ~FileStrategy() = default; //виртуальный деструктор по умолчанию
    virtual void use() = 0; //виртуальный метод,в котором буду происходить действия (стратегии)
};
/*
* Стратегия создания файла
* */
class CreateFile : public FileStrategy // CreateFile наследник FileStrategy
                                       //Делаем это для того,что бы мы могли определить методы use и деструктор(если требуется)
{
public:
    void use()override { //override - показываем,что этот метод берем из родительского класса,а не просто создаем свой
        string file;
        cout << "Введите имя файла:" << endl;
        cin >> file;
        ofstream fout(file); //создаем поток файла
        fout.close(); //закрываем
        info->filename = file; //теперь имя файла экземпляра класса равно имени файла указанному пользователем
    }
};
 
/*
* Стратегия записи в файл
* */
class WriteToFile : public FileStrategy
{
public:
    void use()override {
        string StudentName;
        int number;
        int course;
        string about;
        cout << "Введите Имя студента" << endl;
 
        cin >> StudentName;
        cout << "Введите курс студента" << endl;
        cin >> course;
        cout << "Введите номер методического пособия" << endl; 
        cin >> number;
        cout << "Введите Название методического пособия";
        cin >> about;
        ofstream fout; //создаем поток файла
        fout.open(info->filename, ios::out | ios::app); //откарываем файл в режиме записи в конец файла
        fout << StudentName <<" "<< course<< " "<< number<< " " << about; //записываем строку которую передали в аргументах функции
        fout.write("\n", 1); //а так же,пишем в файл переход на след. строку (если этого не сделать,то все строки после записи будут в первой строке)
        cout << endl << "Готово" << endl; //отладка
        fout.close(); //закрываем файловый поток
    }
};
 
/*
* Стратегия: отобразить все записи
* */
class ShowAllInFile : public FileStrategy
{
public:
    void use()override {
        ifstream f(info->filename); //открывает файловый поток в режиме чтения
        while (f) //пока существует поток (а пока он существует- существуют записи в файле)
        {
            string str; //буфер строки
            getline(f, str); //записываем очередную считанную строку в буефер
            cout << str << endl; //выводим её
        };
        f.close(); //закрываем файла
    }
};
 
/*
* Стратегия: найти запись по ключу
* */
/*
* Ключ- это слово,которое должно встретится в строке файла
* Мы его ищем
* Чем точнее укажем то,что нам нужно- тем точнее получим результат только с тем,что нас интересует
* Например,если ключ '1-ПИ', то в ходе работы функции мы получим всех студентов группы 1-ПИ
* Потому что эта информация занесена в строку
* Проще говоря,эта задача сводится к поиску подстроки в строке
* */
class FindEntryByKey : public FileStrategy
{
public:
    void use()override {
        string key; //ключ
        cout << "Введите ключ поиска:" << endl;
        cin >> key; //вводим ключ
        regex reg1(key, icase); //регулярныое выражение. первый аргумент - то,что будем искать , второй аргумент - флаг, режим игнорирования регистра
        ifstream f(info->filename); //открываем файловый поток (при этом обращаемся к экземпляру класса)
        while (f) //пока существует поток
        {
            string str; //буфер
            getline(f, str); // записываем очередную строку которая считана в файле в буфер
                             /*
                             * regex_search - функция,которая призвана искать совпадения в строке. Простыми словами-ищет подстроку в строке
                             * Первй аргумент- в какой строке будем искать
                             * Второй аргумент- регулярное выражение по которому искать
                             * Так как наше регулярное выражение равно простой строке,то функция просто найдет эту строку в строке как подстроку
                             * Возвращает true , если совпадение найдено
                             * И false если совпадения не было
                             * */
            if (regex_search(str, reg1)) {  //совпадение?
                cout << str << endl; //выводим
            } //если совпадения не было,то нас просто перебросит в начало
 
        };
        f.close(); //закрываем файл
    }
};
 
/*
* Стратегия: удалить по ключу
* */
/*
* Функция удаления строки из файла по ключу
* В общем и целом, по аналогии с поиском:
* 1)Читаем очередную строку
* 2)Проверяем её на ключ,которому удаляем
* 3)Если ключ в строке найден- то отбрасываем её
* 4)Если ключ не найден- пишем в новый файд
* Таким образом,мы попросту "пропускаем" строки которые нам не подходят
* Плюс данного подхода в том,что мы можем удалять группы строк
* */
class deleteEntryByKey : public FileStrategy
{
public:
    void use() override {
        ofstream fout("buf.txt"); //Наш буфферный файл. Создаем его
        fout.close(); // И тут же закрываем
        string key; // ключ
        cout << "Введите ключ удаления:" << endl;
        cin >> key; //вводим ключ
        regex reg1(key, icase); //регулярныое выражение. первый аргумент - то,что будем искать , второй аргумент - флаг, режим игнорирования регистра
        ifstream f(info->filename); //Открываем поток основного файла с данными
        while (f) //пока файл существует
        {
            string str; //буфферная строка
            getline(f, str); //получаем очередную строку из файла и записываем её в буфер
            if (!regex_search(str, reg1)) { //Если найденная строка нам НЕ подходит по ключу (иными словами в ней НЕ нашелся тот ключ по которому мы удаляем)
                fout.open("buf.txt", ios::out | ios::app); //то открываем буфферный файл в режиме записи в конец
                fout << str; //и записываем строку которая сейчас в буффере строки из файла
                fout.write("\n", 1); //ну и не забываем перейти на следующую строку
            }
            
        }
        if (remove(info->filename.c_str())) {
            printf("Error removing file");
        }
 
 
        if (rename("buf.txt", info->filename.c_str()) == 0)            // переименование файла
            cout << "Файл успешно переименованn";
        else
            perror("Error:");
            fout.close(); //закрываем файл
 
        };
        /*
        * Теперь необходимо привести всё к первоначальному виду.
        * 1)Удалим файл из которого читали и удаляли по ключу
        * 2)Переименуем буфферный файл именем которое было изначально
        * */
 
        
};
 
/*
* Отделение процедуры выбора алгоритма от его реализации через контекстный подход
* */
class Context
{
protected:
    FileStrategy * operation;  //указатель на стратегию. мы должны вызывать методы из классов-стратегий
 
public:
    virtual ~Context() {} //класс-клиент может определить вызывать деструктор
    virtual void useStrategy() = 0; // класс-клиент устанавливает нужную стратегию
    virtual void setStrategy(FileStrategy* v) = 0; //класс-клиент устанавливает стратегию, при чем аргумент- указатель на стратегию
};
 
/*
* Клиент,который извлекает нужные стратегии в контексте и определяет методы использования,установки стратегий */
class Client : public Context //клиент наследник контекста
{
public:
    void useStrategy() override
    {
        operation->use(); //у каждой стратегии есть метод 'use' в котором происходят какие то действия. Мы просто вызываем этот метод
    }
 
    void setStrategy(FileStrategy* o)override
    {
        operation = o; //сначала нужно установить стратегию .Для этого, передеанный аргмуент в метод присваиваем указателю на стратегию в классе context
    }
};
 
int main(int /*argc*/, char* /*argv*/[])
{
    system("chcp 1251");
    setlocale(LC_ALL, "rus");
    string s1, s2;
    Client customClient; //объявляем новый клиент
                         //Стратегии
    CreateFile str1;
    WriteToFile str2;
    ShowAllInFile str3;
    FindEntryByKey str4;
    deleteEntryByKey str5;
 
 
    int t; //переменная-переключатель действия
    while (true) {
        cout << "Добро пожаловать,хозяин. Хотите начать работу?" << endl;
        cout << "1- Создать файл" << endl;
        cout << "2- Добавить запись" << endl;
        cout << "3- Показать все записи" << endl;
        cout << "4- Найти запись" << endl;
        cout << "5- Удалить запись" << endl;
        cout << "0- Выйти" << endl;
        cin >> t;
 
        if (t == 1) {
            customClient.setStrategy(&str1); //устанавливаем первую стратегию создания файла
            customClient.useStrategy(); //и используем её
        }
        if (t == 2) {
            customClient.setStrategy(&str2);
            customClient.useStrategy();
        }
        if (t == 3) {
            customClient.setStrategy(&str3);
            customClient.useStrategy();
        }
        if (t == 4) {
            customClient.setStrategy(&str4);
            customClient.useStrategy();
        }
        if (t == 5) {
            customClient.setStrategy(&str5);
            customClient.useStrategy();
        }
        if (t == 0) {
            break;
        }
    }
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
30.05.2018, 20:14
Цитата Сообщение от Белка2547 Посмотреть сообщение
f это поток
И что? Ты же пытаешься удалить тот же самый файл.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2018, 20:14
Помогаю со студенческими работами здесь

Необходимо переименовать файл с консоли, а после открыть его для редактирования
Необходимо переименовать файл из консоли программы, а после открыть его для редактирования. Не понимаю, как это сделать...

Дан файл. Удалить из него третью строку. Результат записать в другой файл
Дан файл. Удалить из него третью строку. Результат записать в другой файл. Формат входных данных В файле записано несколько...

удалить и создать файл
Добрый день. У меня вопрос. Работаю с файлами с помощью fstream. Всё разобрался с ним, но не пойму как удалить и тут же создать...

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

Как удалить файл?
Создал файл text.txt и хочу удалить его програмно... Но функция remove() не работает. Может кто знает в чем дело... Вот код:#include...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru