Как в текстовом файле удалить пробелы после открывающей скобки, а затем заменить текст в файле на откредактированный? 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 шт):

Автор решения: Stanislav Volodarskiy

В вашем решении несколько ошибок.

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 (
 (((((((
→ Ссылка