Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

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

22K
16 мая 2007 года
zvr
5 / / 13.02.2007
Доброго времени суток!
Помогите в решении следующей задачи:

Напишите программу, переносящую слишком длинные строки. Слова разбивать нельзя (неумешающееся слово следует перенести целиком). Ширину строки считать равной 60.

Как вывести содержимого текстового файла знаю, логику тоже понимаю(нужно найти последний пробел до 60 символа в строке и все, что стоит до него вывести в одной строке, все остальное перенести в другую.. ) как реализовать не знаю....

Помогите пожалуйста!
2.0K
16 мая 2007 года
BroKeR
163 / / 04.05.2006
тебе не нужен пробел.ТОчнее нужен но не так.Как бы делал я.Идешь по строке 60 знаков,если за это время встретил '\0' то выходим из цикла.Если 60 символ не " ",то начинаем отступать назад,пока не встретим " ".Как только встретили,пробел меняем на '\0',а с этого места идем вперед до первого встречного пробела либо конца строки.Слово пишем в новую строку.
245
16 мая 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: BroKeR
тебе не нужен пробел.ТОчнее нужен но не так.Как бы делал я.Идешь по строке 60 знаков,если за это время встретил '\0' то выходим из цикла.Если 60 символ не " ",то начинаем отступать назад,пока не встретим " ".Как только встретили,пробел меняем на '\0',а с этого места идем вперед до первого встречного пробела либо конца строки.Слово пишем в новую строку.



А какой смысл?
если поменять на '\n', то вот как раз и будет конец строки, начало новой. После этого символа в пределах 60 символов все '\n' меняем на пробел и так далее

Код:
current=0;
while (!finish)
{
 for(i=current;i<current+60;i++)
 {
   if(str==0) {finish=TRUE;break}
   if(str=='\n') str=' ';
 }
 while(str[i--]!=' ');
 str='\n';
 current=current+i+1;
}

Вроде так. Получается поделенный на строки символами '\n' массив.

Ай! совсем забыл, что при "переходе" на следующую строчку мы смотрим от начала массива, а не строчки. Исправлять пришлось.
2.0K
16 мая 2007 года
BroKeR
163 / / 04.05.2006
Цитата: ~ArchimeD~
А какой смысл?
если поменять на '\n', то вот как раз и будет конец строки, начало новой. После этого символа в пределах 60 символов все '\n' меняем на пробел и так далее


Точно,че то я не до тумкал.Однозначно +

2.1K
17 мая 2007 года
elan
56 / / 10.04.2003
Цитата: ~ArchimeD~
Код:
current=0;
while (!finish)
{
 for(i=current;i<current+60;i++)
 {
   if(str==0) {finish=TRUE;break}
   [color=red]if(str=='\n') str=' ';[/color]
 }
 while(str[i--]!=' ');
 [color=red]str='\n';[/color]
 current=current+i+1;
}

вообще-то str='\n'; нужно бы заменить на str[i+1]='\n'; но после if(str=='\n') str=' '; весь цыкл теряет смысл

Код:
char *ch = str;
char *last_space = NULL;
unsigned int length = 0;
for(char c = *ch; c!='\0'; ch++, c=*ch)
{
  if(c=='\n')
  {
    *ch = ' ';
    last_space = ch;
  }
  else if(c==' ')
  {
    last_space = ch;
  }
  else
  {
    length++;
    if((length>=60)&&last_space)
    {
      *last_space = ' ';
      length = last_space - ch;
      last_space = NULL;
    }
  }
}

22K
17 мая 2007 года
zvr
5 / / 13.02.2007
Всем спасибо! Буду пробывать!
245
17 мая 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Почему теряет? Мы строки подравниваем как можно ближе к 60 байтам. Конечно если это не нужно, то убрать надо...
Цитата:
str[i+1]='\n'

ой, ещё ошибся малость. времени мало было подумать, когда отвечал

9
19 мая 2007 года
Lerkin
3.0K / / 25.03.2003
Ну, это - скорее как шутка ;)
Код:
...
    char* str = "...текст, считанный из файла...";

    int pos = 0;
    char* p = str;

    while (*p++)
    {
    if (pos++ > 60)
    {
        while (*(--p) != ' ');

        *p = '\n';
        pos = 0;
    }
    }

    cout << str << endl;
...


А вот поинтереснее:
Код:
...
    // переменные те же, что и в предыдущем примере
    char* space = str;

    while (*p++)
    {
    if (++pos < 60)
    {
        if (*p == ' ')
        space = p;
        else if (*p == '\n')
        {
        space = ++p;
        pos = 0;
        }
    }
    else
    {
        p = space;
        *p = '\n';
        pos = 0;
    }
    }
...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог