следующий символ на месте предыдущего (вывод последовательности затерающихся символов)

Модератор: Модераторы разделов

Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

следующий символ на месте предыдущего

Сообщение Stauffenberg »

Всем привет.

Вот такой вопросик: как вывести на экран последовательность символов, но при этом каждый последующий символ должень быть на месте предыдущего.

Спасибо
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: следующий символ на месте предыдущего

Сообщение Женя Подсыпальников »

Аво, тута :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: следующий символ на месте предыдущего

Сообщение diesel »

Stauffenberg писал(а):
11.12.2008 15:39
Всем привет.

Вот такой вопросик: как вывести на экран последовательность символов, но при этом каждый последующий символ должень быть на месте предыдущего.

Спасибо

в смысле так:

Код: Выделить всё

for i in `seq 0 9`; do echo -ne "\r$i";sleep 2; done;

?
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: следующий символ на месте предыдущего

Сообщение Stauffenberg »

Женя Подсыпальников, diesel:
Спасибо, но...
Я прошу прощения - это была моя ошибка.
На С/С++ (;
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: следующий символ на месте предыдущего

Сообщение Женя Подсыпальников »

А мне тут слово понравилось: символ "забоя"... :D
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: следующий символ на месте предыдущего

Сообщение Stauffenberg »

Женя Подсыпальников писал(а):
11.12.2008 17:12
А мне тут слово понравилось: символ "забоя"... :D

пасиб! попробую дома послать пару символов "на забой"
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: следующий символ на месте предыдущего

Сообщение кодировщик »

совсем похожая задача, тоже на С.
Вывести например последние 5 строк файл, подобие команды tail.
Думаю сначала попасть на конец файла

Код: Выделить всё

lseek(fp,0,SEEK_END)

Потом подняться вверх на 6 символов '\n' ну и вывести всё что после.
Хотелось бы услышать, правильный ли ход моих мыслей?!
Заранее спасибо.
Спасибо сказали:
Аватара пользователя
nesk
Сообщения: 2268
Статус: Линукссаксовец
ОС: MS Windows XP Home SP3

Re: следующий символ на месте предыдущего

Сообщение nesk »

а чего не сразу
lseek(fp,-6,SEEK_END)
Внимание: У меня под рукой нет машины с Linux. Я не использую эту ОС. Ответы я даю либо по памяти, либо мне помогает гугл. Тщательно читайте маны по тем командам и конфигурационным файлам, которые я упоминаю.

0xDEFEC8ED
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: следующий символ на месте предыдущего

Сообщение кодировщик »

nesk писал(а):
11.12.2008 17:58
а чего не сразу
lseek(fp,-6,SEEK_END)

Так это же сдвинет указатель на 6 байтов от конца файла?!
А нужно попасть на 6 символ '\n' от конца файла. :blush:
Спасибо сказали:
MiK13
Сообщения: 1263
ОС: Linux Debian

Re: следующий символ на месте предыдущего

Сообщение MiK13 »

diesel писал(а):
11.12.2008 16:21
в смысле так:

Код: Выделить всё

for i in `seq 0 9`; do echo -ne "\r$i";sleep 2; done;
?

В принципе верно, но в исходном вопросе было только :
Stauffenberg писал(а):
11.12.2008 15:39
как вывести на экран последовательность символов, но при этом каждый последующий символ должень быть на месте предыдущего.

И не было указано, что этот символ будет в начале строки. А в этом примере \r будет возвразать вывод именно в начало строки.
Поэтому тут надо заменить \r на \b
Кстати, это же касается и программ на C/C++. После вывода любого печатного знака курсор сместится к следующей позиции и чтобы его вернуть на предыдущую позицию, надо вывести знак с кодом 8, т.е. putchar(8); или putchar('\b');
Надо только учитывать, что вывод в stdout буферизуется до вывода перевода строки, поэтому может понадобиться добавка fflush(stdout);

кодировщик писал(а):
11.12.2008 17:56
совсем похожая задача, тоже на С.

Я бы не сказал, что похожая
кодировщик писал(а):
11.12.2008 17:56
Вывести например последние 5 строк файл, подобие команды tail.
Думаю сначала попасть на конец файла

Код: Выделить всё

lseek(fp,0,SEEK_END)

Потом подняться вверх на 6 символов '\n' ну и вывести всё что после.
Хотелось бы услышать, правильный ли ход моих мыслей?!

Ход мыслей правильный, только что значит "поднаться вверх на 6 символов '\n' ?
Т.е. можно написать

Код: Выделить всё

lseek(fp,-N,SEEK_END)
, только чему равно это N?
Если длина строк не будет превышать 100 знаков, то можно в качестве N использовать 600 (надо только учитывать, что при кодировке UTF-8 русские буквы будут занимать по 2 байта). А если будут строки длиной по 100 тыс знаков?
Но в принципе верно. После

Код: Выделить всё

lseek(fp,-N,SEEK_END)
прочитать эти N знаков в буфер, а потом найти 6-й знак циклом

Код: Выделить всё

j=0;
for(i=N-2;i;i--)
  if((buff[i]=='\n')&&(++j==5)) break;

подняться вверх на 5 строк. Ну и потом вывести эти строки на экран чем-то типа:

Код: Выделить всё

write(1,c+i,N-i);

(код не проверял, поэтому за правильность не отвечаю).
Спасибо сказали:
watashiwa_daredeska
Бывший модератор
Сообщения: 4038
Статус: Искусственный интеллект (pre-alpha)
ОС: Debian GNU/Linux

Re: следующий символ на месте предыдущего

Сообщение watashiwa_daredeska »

MiK13 писал(а):
11.12.2008 22:09
кодировщик писал(а):
11.12.2008 17:56
Вывести например последние 5 строк файл, подобие команды tail.
Думаю сначала попасть на конец файла

Код: Выделить всё

lseek(fp,0,SEEK_END)

Потом подняться вверх на 6 символов '\n' ну и вывести всё что после.
Хотелось бы услышать, правильный ли ход моих мыслей?!

Ход мыслей правильный
Ход мысли неправильный, если рассматривать это не как исключительно искусственную учебную задачу. 1). tail работает не только с файлами, но и, например, с pipe'ами. 2). Делать искусственные предположения и ограничения (на длину строки, например) -- нехорошо.
Спасибо сказали:
Аватара пользователя
кодировщик
Сообщения: 974
Статус: зарёган в пятницу 13
ОС: Linux

Re: следующий символ на месте предыдущего

Сообщение кодировщик »

MiK13 писал(а):
11.12.2008 22:09
Ход мыслей правильный, только что значит "поднаться вверх на 6 символов '\n' ?

Предложения могут быть разной длины. Не известно ведь из скольких символов каждое состоит, поэтому
думаю нужно пользоваться escape-символом '\n', теперь вот не могу въехать как из конца файла
подниматься по символах к началу файла?! :blush:
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: следующий символ на месте предыдущего

Сообщение Женя Подсыпальников »

Код: Выделить всё

void testIt(char* pstrTest)
{
  if (pstrTest) {
    char* pstrTemp = pstrTest;
    while (*pstrTemp) {
      cout << *pstrTemp;
      if (*(++pstrTemp)) {
        cout << '\b';
      }
    }
  }
}

Но в ассемблях, гутарят,
код машине - буде много кратче да живче :)
Пойдём на рыбалку !
Спасибо сказали:
MiK13
Сообщения: 1263
ОС: Linux Debian

Re: следующий символ на месте предыдущего

Сообщение MiK13 »

кодировщик писал(а):
12.12.2008 09:29
Предложения могут быть разной длины. Не известно ведь из скольких символов каждое состоит, поэтому
думаю нужно пользоваться escape-символом '\n', теперь вот не могу въехать как из конца файла
подниматься по символах к началу файла?! :blush:

Есть какие-то функции отображения файлов в память. Я ими пока ещё ни разу не пользовался. Но если это можно, то можно просто пройтись по памяти (в которую отображён файл) вниз и найти 6-й знак перевода строки. Примерно так, как я писал раньше.

Правда, остаётся не ясным вопрос о длине строк -- что под ними понимать? Можно как последовательность знаков, заканчивающуюся знаком перевода строки (10), а можно -- как строку, которая отображается на экране. На котором врядли может поместиться больше 200-300 знаков.
Спасибо сказали: