Как в текстовом файле удалить пробелы после открывающей скобки, а затем заменить текст в файле на откредактированный? C++
Задание - в текстовом файле удалить пробел после открывающей скобки , и вывести отредактированный текст в этот же файл. еще почему-то файл в результате работы программы оказывается пустым
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
setlocale(LC_ALL, "rus");
ifstream fin;
ofstream fout;
string name;
cout << "Введите имя файла> ";
cin >> name;
fin.open("C:\\Users\\user\\Desktop\\файлы для лр4\\" + name + ".txt"); //проверяем, возможно ли открыть файл
fout.open("C:\\Users\\user\\Desktop\\файлы для лр4\\" + name + ".txt");
string strfile;
vector<string> file;
if (fin.is_open()&& fout.is_open()) {
while (!fin.eof()) {
getline(fin, strfile);
int i=0;
if(strfile[i] == '(' && cin.peek() == ' ') {
cin.get(strfile[i]);
file.push_back(strfile);
}
fout << strfile;
}
}
else {
cout << "Файл не открылся\n";
}
fin.close();
return 0;
}
Ответы (1 шт):
В вашем решении несколько ошибок.
1. Вы открываете один и тот же файл два раза в начале программы. fout открывает файл на запись. В этот момент содержимое файла стирается. Когда вы позже будете его читать через fin там будет пусто:
fin.open(filename);
fout.open(filename);
2. Так читать из файла не нужно:
while (!fin.eof()) {
Если вы читаете из файла построчно, то
while (getline(fin, line)) {
// process line
}
3. Здесь делается попытка читать из строки которая уже прочитана (cin.peek)? Это так не работает. Кроме того скобка отыскивается только в начале строки.
int i=0;
if(strfile[i] == '(' && cin.peek() == ' ') {
Теперь возможное решение. Я не буду воспроизводить логику вашей программы, а покажу похожую функциональность.
Так как мы собираемся читать один и тот же файл, то операции чтения надо отделить во времени от операций записи. Порядок действий будет такой:
открыть файл на чтение
прочитать весь текст
закрыть файл
отредактировать текст
открыть файл на запись
записать отредактированный текст
закрыть файл
Редактировать текст я буду с помощью регулярного выражения. Не потому что это необходимо, а потому что это удобно.
Дальнейшие комментарии в тексте программы:
// g++ -std=c++11 -pedantic -Wall -Wextra edit_file.cpp
#include <fstream>
#include <sstream>
#include <regex>
int main(int /* argc */, char **argv) {
std::string text;
{
// открываем файл (имя берется из параметров программы для простоты)
std::ifstream ifs(argv[1]);
// трюк, который копирует файловый поток в строковый поток
std::stringstream buffer;
buffer << ifs.rdbuf();
// из строкового потока извлекаем весь текст
text = buffer.str();
// здесь вызывается деструктор ifs который закрывает файл
}
{
// регулярное выражение ищет открывающую скобку и пробелы после неё
std::regex e("\\( +");
// заменяем найденное на скобки без пробелов
text = std::regex_replace(text, e, "(");
}
{
// открываем тот же файл на запись
std::ofstream ofs(argv[1]);
// записываем изменённый текст
ofs << text;
// здесь вызывается деструктор ofs который закрывает файл
}
}
$ cat text.txt (( (( a (b ( cde ( (( ( ( ( ( ( $ ./a.out text.txt $ cat text.txt ((((a (b (cde ( (((((((