LINUX.ORG.RU

как в C можно сделать прокрутку экрана...


0

0

в универе дали задание написать addressbook... и если при выводе результата поиска, или просто при выводе всех записей в ней, будет больше, чем может поместится в терминале, нужно предусмотреть прокрутку экрана вверх и вниз. как это можно сделать? чем?...


Ответ на: комментарий от anonymous

его как раз сейчас и читаю:)... а можно чуть более конкретно, что именно оттуда?...

CAT_XP
() автор топика
Ответ на: комментарий от fghj

а каким образом это можно сделать?

#include <stdio.h>

int main()
{
/* blabla */

int i=0;
for (;i<1000;i++) printf("use less or more\n");

/* eshe kakoi'to blabla coda */

return 0;
}

CAT_XP
() автор топика
Ответ на: комментарий от anonymous

думаю ncurses - слишком геморрно, а пайпы - слегка не правильно, с точки зрения задания.

Можно сделать стандартным путём - прочитать все данные в буфер, потом вывести то, что влезло (кстати, так и форматирование можно настроить), а потом просто отслеживать нажатия на клавиши, ведь если я правильно понимаю, должна быть ещё и различные функции у книжки, к примеру, записи нового адреса в книжку, вот и сделать что-то вроде

switch (c=getchar()){

case 'a': add_record(); break;

case '^[[A' /*как там код кнопы вверх записывается? :)*/ : list_up(); break;

}

Ну и по list_up() перерисовывать экран =)) То есть выводить данные в соответствии с тем, что там в буфере.

З.Ы.

АФАИК проги типа less и more так и написаны =))

Laz ★★★★★
()
Ответ на: комментарий от CAT_XP

man 2 pipe
man 2 fork,

алгоритм создаешь пару дескрипторов с помощью pipe,
форкаешься, переоткрываешь в ребенке стантартный ввод,
замещаешь ребенака с помощью exec less или more.
в отце пишешь все данные в свой конец pipe,
ждешь завершения ребенка.

info libc есть пример работы с pipe

fghj ★★★★★
()
Ответ на: комментарий от fghj

void print_list(list lst)
{
int p[2], status, options;
pid_t pid;
pipe(p);
close(p[1]);
if (!(pid=fork())) {
close(0);
dup2(p[0],0);
execl("less","less");
}
else {
Xprint_list(lst, p[0]);
waitpid(pid, &status, options);
}
}

void Xprint_list(list lst, int descr)
{
list_el *p=*lst;
FILE * fp;

fp=fdopen(descr,"w");

while (p){
fprintf(fp,"\tRecord:\n");
fprintelem(fp, p->data);
p=p->next;
}
fclose(fp);
}

/*....*/
print_list(dblistname);
/*....*/


где-то тут я видимо ошибся, но никак не могу понять где:(...

CAT_XP
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.