Вот пример реализации функции replace_text, которая заменяет фрагмент текста в файле на другой текст, начиная с заданной позиции. Для этого мы будем использовать fstream, метод .seekg() и оператор <<.
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
// Функция для печати файла
void print_file(string filename) {
ifstream myfile(filename, ios::ate);
int size = myfile.tellg();
myfile.seekg(0);
char content[size];
myfile.read(content, size);
cout.write(content, size);
}
void replace_text(string filename, string text, int pos) {
// Открываем файл для чтения и записи
fstream file(filename, ios::in | ios::out);
if (!file) {
cerr << "Ошибка при открытии файла!" << endl;
return;
}
// Читаем содержимое файла в строку
string content((istreambuf_iterator<char>(file)), istreambuf_iterator<char>());
// Закрываем файл
file.close();
// Проверяем, если позиция находится внутри длины содержимого
if (pos < 0 || pos >= content.length()) {
cerr << "Позиция вне диапазона!" << endl;
return;
}
// Вставляем новый текст
content.replace(pos, text.length(), text);
// Открываем файл снова для записи
file.open(filename, ios::out | ios::trunc);
file << content;
file.close();
}
int main() {
// Ввод данных
string filename;
getline(cin, filename);
string text;
getline(cin, text);
int pos;
cin >> pos;
// Вызов функции замены текста
replace_text(filename, text, pos);
// Вывод обновленного файла
print_file(filename);
return 0;
}
Описание кода:
- Мы открываем файл в режиме чтения и записи (ios::in | ios::out).
- Читаем содержимое файла в строку content.
- Проверяем, находится ли заданная позиция в пределах длины контента.
- Заменяем сегмент текста в строке content на новый текст, используя метод replace.
- Открываем файл снова в режиме записи (ios::out | ios::trunc), чтобы перезаписать его содержимое.
- Записываем измененное содержимое обратно в файл.
- Наконец, в функции main мы вызываем print_file для вывода обновленного файла.
Задание: Напиши код для функции replace_text, чтобы она заменяла фрагмент текста файла на другой текст (см. секцию Входные данные).
Входные данные
На вход функции подаются
3
3 аргумента в таком порядке:
имя файла, который нужно открыть (параметр filename)
одна строка текста - тот текст, на который нужно заменить фрагмент текста файла (параметр text)
целое число - позиция исходного фрагмента текста файла (параметр pos)
Используй fstream, метод .seekg и оператор <<!
Подсказка
Содержимое файлов перед заменой
Имя файла Содержимое
Best-langs/c++.txt
Язык Python - лучший в мире!
Математика/Цифры.txt
123456789
Sample Input 1:
Best-langs/c++.txt
C++
9
Sample Output 1:
Язык C++ - лучший в мире!
Sample Input 2:
Математика/Цифры.txt
4321
5
Sample Output 2:
123454321
Напишите программу. Тестируется через stdin → stdout
Верно решили 194 учащихся
Из всех попыток 58% верных
Time Limit: 5 секунд
Memory Limit: 256 MB
C++
1
#include <iostream>
2
#include <string>
3
#include <fstream>
4
using namespace std;
5
6
// Функция для печати файла
7
// НЕ ИЗМЕНЯТЬ!
8
void print_file(string filename)
9
{
10
ifstream myfile(filename, ios::ate);
11
12
int size = myfile.tellg();
13
myfile.seekg(0);
14
15
char content[size];
16
myfile.read (content, size);
17
18
cout.write(content, size);
19
}
20
21
void replace_text(string filename, string text, int pos)
22
{
23
// Здесь будет твой код . . .
24
}
25
26
// НЕ ИЗМЕНЯТЬ!
27
int main()
28
{
29
// Ввод данных
30
string filename;
31
getline(cin, filename);
32
33
string text;
34
getline(cin, text);
35
36
int pos;
37
cin >> pos;
38
39
// Вызов твоей функции
40
replace_text(filename, text, pos);
41
42
// Вывод ответа
43
print_file(filename);
44
}