2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Помощь по С++
Сообщение12.03.2015, 11:18 


20/10/12
235
Добрый день, уважаемые участники форума!

Помогите решить задачу выравнивания текста на C++:
из файла дан текст и дана длина требуемой строки - необходимо выровнять строки по центру.
Для меня загвоздка состоит в том, что нужно использовать средства стандартной библиотеки , в С++ -
я начинающий.
Задачу чтения из файла я уже решил. У меня есть класс Text (с полем string Content) и метод выравнивания. В классе уже хранится строка с текстом. Как подступиться к задаче выравнивания? Можно ли это сделать легко используя STL? (В своих попытках я постоянно сбиваюсь на посимвольный разбор строки)

код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;

class Text
{
   public:

   void GetText(ifstream &in);
   void AlignCenter(int width);

   string Str;//
};

void Text::GetText(ifstream &in)
{
  if( in.is_open() )
  {
         in.seekg(0, ios::end);
         Str.resize(in.tellg());
         in.seekg(0, ios::beg);

     in.read((char *)Str.data(), Str.size());
  }
}

void Text::AlignCenter(int width)
{
   //do smth...
}

int main(void)
{
        Text myText;
        ifstream myfile("example.txt", ios::binary);// ios::binary ???? см. код GetText

        myText.GetText(myfile);

        cout << "Before:\n" << myText.Str;
       
        //
        cout << "\nAfter:\n" << myText.Str;

        return 0;
}

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 11:31 
Заслуженный участник


02/08/11
6892
shukshin в сообщении #989184 писал(а):
in.read((char *)Str.data(), Str.size());
in.read((char *)Str.data(), Str.size()); - жость, однако. Надеюсь, вы знаете почему так делать ни в коем случае нельзя, и делаете так сознательно.

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 11:32 


24/05/09

2054
А что тут сложного? Подсчитать сколько символов в вашей строке - Х. Вычесть из максимального количества символов в строке ваше Х, поделить на 2 - и столько пробелов добавить к началу вашей строки - вот строки и выровняются посередине.

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 13:14 
Аватара пользователя


07/02/12
1403
Питер
warlock66613 в сообщении #989191 писал(а):
shukshin в сообщении #989184 писал(а):
in.read((char *)Str.data(), Str.size());
in.read((char *)Str.data(), Str.size()); - жость, однако. Надеюсь, вы знаете почему так делать ни в коем случае нельзя, и делаете так сознательно.

Почему нельзя?

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 14:52 


11/12/14
893
shukshin в сообщении #989184 писал(а):
из файла дан текст и дана длина требуемой строки - необходимо выровнять строки по центру.


Если пытаться придать смысл сказанному, то задача похоже на самом деле состоит в том, что из файла надо через std::getline считать все строки в контейнер, определить максимальную длину и добить нужным числом пробелов по предложенной выше схеме. Иначе не вижу никакого смысла.

-- 12.03.2015, 15:52 --

bondkim137 в сообщении #989236 писал(а):
Почему нельзя?


В С++98 прямо оговорено, что буфер возвращаемый .data() модифицировать нельзя.

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 19:28 


24/05/09

2054
aa_dav в сообщении #989275 писал(а):
Иначе не вижу никакого смысла.

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

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 20:27 
Заслуженный участник


02/08/11
6892
bondkim137 в сообщении #989236 писал(а):
Почему нельзя?
К сказанному aa_dav добавлю. Потому что не всякий констанстный указатель может быть преобразован к неконстантному. Таким образом, то, что ваш код работает обеспечивается конкретной реализацией библиотечного класса string. От хорошего программного модуля ожидается сохранение рабоспособности при изменении реализации другого модуля без изменения интерфейса. Доступный для записи указатель есть у vector, но не у string.

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 22:44 
Аватара пользователя


07/02/12
1403
Питер
aa_dav в сообщении #989275 писал(а):
В С++98 прямо оговорено, что буфер возвращаемый .data() модифицировать нельзя.

а здесь туда пишется? тогда согласен, плохо

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 23:08 
Заслуженный участник


02/08/11
6892
По вопросу - полагаю, что помимо прочего задание подразумевает выполнение без использования циклов за счёт активного задействования богатых стандартных алгоритмов (тех, что в #include <algorigthms>).

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 23:27 
Заслуженный участник


04/05/09
4582
warlock66613 в сообщении #989501 писал(а):
По вопросу - полагаю, что помимо прочего задание подразумевает выполнение без использования циклов за счёт активного задействования богатых стандартных алгоритмов (тех, что в #include <algorigthms>).
#include <algorithm>
Да, я - зануда. :-)

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение12.03.2015, 23:46 
Аватара пользователя


28/01/12
467
venco в сообщении #989519 писал(а):
Да, я - зануда. :-)
Это вы о чём?

 Профиль  
                  
 
 Re: Помощь по С++
Сообщение13.03.2015, 03:20 
Заслуженный участник


04/05/09
4582
Это я просто поправил название стандартного файла: algorithm

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group