2014 dxdy logo

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

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




 
 Помощь по С++
Сообщение12.03.2015, 11:18 
Добрый день, уважаемые участники форума!

Помогите решить задачу выравнивания текста на 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 
shukshin в сообщении #989184 писал(а):
in.read((char *)Str.data(), Str.size());
in.read((char *)Str.data(), Str.size()); - жость, однако. Надеюсь, вы знаете почему так делать ни в коем случае нельзя, и делаете так сознательно.

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 11:32 
А что тут сложного? Подсчитать сколько символов в вашей строке - Х. Вычесть из максимального количества символов в строке ваше Х, поделить на 2 - и столько пробелов добавить к началу вашей строки - вот строки и выровняются посередине.

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 13:14 
Аватара пользователя
warlock66613 в сообщении #989191 писал(а):
shukshin в сообщении #989184 писал(а):
in.read((char *)Str.data(), Str.size());
in.read((char *)Str.data(), Str.size()); - жость, однако. Надеюсь, вы знаете почему так делать ни в коем случае нельзя, и делаете так сознательно.

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

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 14:52 
shukshin в сообщении #989184 писал(а):
из файла дан текст и дана длина требуемой строки - необходимо выровнять строки по центру.


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

-- 12.03.2015, 15:52 --

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


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

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 19:28 
aa_dav в сообщении #989275 писал(а):
Иначе не вижу никакого смысла.

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

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

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 22:44 
Аватара пользователя
aa_dav в сообщении #989275 писал(а):
В С++98 прямо оговорено, что буфер возвращаемый .data() модифицировать нельзя.

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

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 23:08 
По вопросу - полагаю, что помимо прочего задание подразумевает выполнение без использования циклов за счёт активного задействования богатых стандартных алгоритмов (тех, что в #include <algorigthms>).

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

 
 
 
 Re: Помощь по С++
Сообщение12.03.2015, 23:46 
Аватара пользователя
venco в сообщении #989519 писал(а):
Да, я - зануда. :-)
Это вы о чём?

 
 
 
 Re: Помощь по С++
Сообщение13.03.2015, 03:20 
Это я просто поправил название стандартного файла: algorithm

 
 
 [ Сообщений: 12 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group