Работа с файлами. C++

K (> 25) - целое число, а сжатый текстовый файл приведен ниже

текст в файле problem.txt : ___Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования. ___Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.

Здесь ___ при пробела, обозначение красной строки

Абзац отделяется красной строкой, пустых строк нет. Отформатируйте текст так, чтобы его ширина не превышала K символов и был выровнен по левому краю, сохраняя разрывы абзаца. Удалите пробелы в конце строки. Сохраните форматированный текст в новом файле.

то что я смог сделать(

#include<fstream>
 
using namespace std;
 
int main() {
    setlocale(LC_ALL, "Rus");
    int k;
    cout<<"Enter k (k>25) = ";
    cin>>k;
    if (k<=25){
        cout<<"Error, r<=25";
        exit(1);
    }
 
    ifstream reed;
    reed.open("problem.txt");
 
    if (!reed.is_open())
    {
        cout << "problem.txt - file not found\n";
        exit(1);
    }
    string get_string, text;
    while (!reed.eof())
    {
        getline(reed, get_string);
        
        text += get_string;
    }
    reed.close();
    ofstream wrt("main.txt");
    wrt << text;
    wrt.close();
    return 0;
}

не понимаю как реализовать, есть идея что считывать текст с файла посимвольно, если пришли на позицию k, то если она пуста, т.е. пробел, заменить на \n, если нет то идем назад и ищем пробел. но реализовать не могу( помогите пожалуйста


Ответы (1 шт):

Автор решения: Алексей Смирнов

Если я все правильно понял, то вот код:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int main()
{
    setlocale(LC_ALL, "Russian");

    int k;
    cout << "Введите k (k > 25): ";
    cin >> k;

    if (k <= 25) {
        cout << "Ошибка, r <= 25!";
        exit(1);
    }

    wifstream input("problem.txt", ios::in);        // wide char версия ifstream
    wofstream output("main.txt", ios::out);         // wide char версия ofstream
    input.imbue(locale("ru_RU.utf8"));              // задаем кодировку для input, problem.txt также должен быть в utf8
    output.imbue(locale("ru_RU.utf8"));             // задаем кодировку для output

    if (!input.is_open()) {
        cout << "problem.txt - файл не найден!\n";
        exit(1);
    }

    wstring word;                                   // wide char версия string
    int count = 0;

    while (input >> word)
    {
        bool islineBiggerThatK = (count + word.length()) > k;
        bool isParagraph = word[0] == '_';

        if (islineBiggerThatK || isParagraph) {
            count = 0;
            output << '\n';
        }

        output << word << ' ';
        count += word.length() + 1;
    }

    input.close();
    output.close();

    return 0;
}

Подаем на вход представленный вами текст:

___Объектно-ориентированное программирование (ООП) — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования. ___Идеологически ООП — подход к программированию как к моделированию информационных объектов, решающий на новом уровне основную задачу структурного программирования: структурирование информации с точки зрения управляемости, что существенно улучшает управляемость самим процессом моделирования, что, в свою очередь, особенно важно при реализации крупных проектов.

Получаем на выходе (при k = 35):


___Объектно-ориентированное 
программирование (ООП) — 
методология программирования, 
основанная на представлении 
программы в виде совокупности 
объектов, каждый из которых 
является экземпляром определённого 
класса, а классы образуют иерархию 
наследования. 
___Идеологически ООП — подход к 
программированию как к 
моделированию информационных 
объектов, решающий на новом уровне 
основную задачу структурного 
программирования: структурирование 
информации с точки зрения 
управляемости, что существенно 
улучшает управляемость самим 
процессом моделирования, что, в 
свою очередь, особенно важно при 
реализации крупных проектов. 

Слова которые не влезают в лимит строки, переносятся. Можно конечно сделать разбиение слова и перенос, но это усложнит код. Да и не уверен что это нужно.

UPD: Код обновил, предыдущая версия неправильно считала длину слова из за неправильной кодировки.

→ Ссылка