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