Форум программистов, компьютерный форум CyberForum.ru

C++

Войти
Регистрация
Восстановить пароль
 
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
#1

Динамически изменяющаяся строка - C++

06.08.2010, 02:01. Просмотров 731. Ответов 7
Метки нет (Все метки)

Есть файл, который постоянно меняется..

Я его читаю так допустим:

C++
1
2
3
4
5
6
7
8
int main()
{ 
while(1) {
   system("clear");
   system("cat /home/alexey/Desktop/log.txt");
   sleep(1);
   }
}
Но программа для терминала и, как видите, текст каждую секунду будет увеличиваться и уходить вверх постепенно. А это плохо если нужное уже вверху т.к. не влазит всё на экран. Пока найдёшь и прочитаеш нужное.. Текст уже на 10 листов может вниз уйти.

Как бы это сделать, чтоб это была, допустим, одна и та же строка, но постоянно менялась (или когда надо), а не новая добавлялась к предыдущей?

Как пример.. в Linux Live-CD BackTrack много таких программ.. когда под строкой-предложением ввести новую команду работает программа и ничего никуда не убегает
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
06.08.2010, 03:19     Динамически изменяющаяся строка #2
tail -f не пробовал ?
вообще лучше юзать popen()
man popen
Код
       FILE *popen(const char *command, const char *type);

       int pclose(FILE *stream);
вывод команды превращается в файловый поток и с ним можно работать, как с обычным файлом

ещё есть '\r' - возврат в начало строки без перехода на новую, ну и '\b'
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
06.08.2010, 10:14     Динамически изменяющаяся строка #3
Цитата Сообщение от Alexoy Посмотреть сообщение
system("cat /home/alexey/Desktop/log.txt");
замените на
C
1
system("tail -n 1 /home/alexey/Desktop/log.txt");
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
06.08.2010, 14:36  [ТС]     Динамически изменяющаяся строка #4
Цитата Сообщение от accept Посмотреть сообщение
вообще лучше юзать popen()
С чтением вроде получилось.. с помощью вашего кода и гугла такое получилось:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
#include <assert.h>
#include <ctype.h>
#include <iostream>
 
using namespace std;
 
int main(void)
{
   int    c;
   FILE   *ifp;
 
   ifp = popen("cat /home/alexey/Desktop/textfile.txt", "r");
   assert(ifp != NULL);
   while ((c = getc(ifp)) != EOF)
      putchar(c); 
   pclose(ifp);
   return 0;
}
Но главная проблема осталась - чтоб содержание файла отображалось на одном и том же месте во время работы программы, а содержание файла постоянно меняется!


Цитата Сообщение от easybudda Посмотреть сообщение
замените на
C++
1
system("tail -n 1 /home/alexey/Desktop/log.txt");
..не подходит, т.к. показывать нужно весь файл, а не последнюю строку.


Цитата Сообщение от accept Посмотреть сообщение
ещё есть '\r' - возврат в начало строки без перехода на новую, ну и '\b'
..с этим можно простой пример? ..например, чтоб число стоя на одном месте каждую секунду увеличивалось на 1. У меня получается только в столбик - а это плохо, о чом я и говорил в самом начале. как я понял - "\r" - возвращает курсор в начало строки, а "\b" - на один символ назад?!

Мне бы что-то похожее тогда, но для всего выводимого текста.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
06.08.2010, 14:59     Динамически изменяющаяся строка #5
Цитата Сообщение от Alexoy Посмотреть сообщение
Но программа для терминала и, как видите, текст каждую секунду будет увеличиваться и уходить вверх постепенно. А это плохо если нужное уже вверху т.к. не влазит всё на экран. Пока найдёшь и прочитаеш нужное.. Текст уже на 10 листов может вниз уйти.
Цитата Сообщение от Alexoy Посмотреть сообщение
..не подходит, т.к. показывать нужно весь файл, а не последнюю строку.
Вы уж определитесь как-нибудь... если файл будет постоянно с начала выводиться, то рано или поздно всё равно за пределы экрана уйдёт, но снизу. То есть последних строк файла не увидите. Делайте оконное приложение с прокруткой и возможностью выбирать - будет вывод в окне показываться с начала, или прокручиваться по мере надобности...
Alexoy
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
06.08.2010, 15:31  [ТС]     Динамически изменяющаяся строка #6
Не.. всё правельно Есть файл - он постоянно изменяется дополняясь. Пусть он не влазит в терминале.. его ведь тоже прокрутить можно если что. Идея - чтоб текст, допустим каждую секунду, прорисовывался начиная с одной и тойже позиции, а не под предыдущим.

Добавлено через 16 минут
Хм.. наверное название всё же не совсем правельное.. "строка" на "текст" можно было заменить.
easybudda
Эксперт С++
9412 / 5435 / 917
Регистрация: 25.07.2009
Сообщений: 10,428
07.08.2010, 00:07     Динамически изменяющаяся строка #7
Цитата Сообщение от Alexoy Посмотреть сообщение
Идея - чтоб текст, допустим каждую секунду, прорисовывался начиная с одной и тойже позиции, а не под предыдущим.
И как Вы себе это представляете? Вывести весь файл, а потом прокрутить окно назад к первой выведенной строчке? Это Вам куда-нибудь в сторону ncurses рыть надо...

Просто из спортивного интереса сделал програмку, суть которой вот, в чём: программе передаётся параметром файл, за которым нужно следить (файл должен хотя бы существовать). При появлении в файле новых данных программа выводит их вместе со временем.
выглядит примерно так: в первой консоли
Код
echo "First line" > watch.txt
./read_last watch.txt
за тем открыл вторую консоль и в ней
Код
echo "bla bla bla" >> watch.txt
echo "one two three" >> watch.txt
ну и так далее...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
 
#define BUF_LEN 4096
#define TIMEOUT 1
 
int main(int argc, char ** argv){
    int fd, ret;
    struct timeval tv;
    fd_set readfds;
    time_t tsec;
    struct tm * pStm;
    char readBuf[BUF_LEN];
 
    if ( argc < 2 ){
        printf("Usage: %s file_name", argv[0]);
        exit(1);
    }
 
    if ( ( fd = open(argv[1], O_RDONLY) ) == -1 ){
        perror("open");
        exit(1);
    }
 
    while ( 1 ){
 
        FD_ZERO(&readfds);
        FD_SET(fd, &readfds);
 
        tv.tv_sec = TIMEOUT;
        tv.tv_usec = 0;
 
        ret = select(fd + 1, &readfds, NULL, NULL, &tv);
        if ( ret == -1 ){
            perror("select");
            exit(1);
        }
 
        if ( ! ret )
            continue;
 
        tsec = time(NULL);
        pStm = localtime(&tsec);
 
        if ( FD_ISSET(fd, &readfds) ){
            ret = read(fd, readBuf, BUF_LEN - 1);
            if ( ret == -1 ){
                perror("read");
                exit(1);
            }
            if ( ! ret )
                continue;
            readBuf[ret] = 0;
            system("clear");
            printf("Last incomming data in file %s at %s\n%s", argv[1], asctime(pStm), readBuf);
        }
    }
 
    close(fd);
    exit(0);
}
правда, выход из неё только Ctrl+C, но можно это поправить...

Добавлено через 6 часов 59 минут
Всё то же самое, только выходит по нажатию enter
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/poll.h>
#include <time.h>
 
#define BUF_LEN 4096
#define TIMEOUT 1
 
int main(int argc, char ** argv){
    char buf[BUF_LEN];
    int fd, ret;
    struct pollfd fds[2];
    time_t nSec;
    struct tm * pTm;
    
    if ( argc < 2 ){
        printf("Usage: %s file_name\n", argv[0]);
        exit(EXIT_FAILURE);
    }
    if ( ( fd = open(argv[1], O_RDONLY) ) == -1 ){
        perror("open");
        exit(EXIT_FAILURE);
    }
    
    fds[0].fd = fd;
    fds[0].events = POLLIN;
    
    fds[1].fd = STDIN_FILENO;
    fds[1].events = POLLIN;
    
    *buf = '\0';
    
    while ( 1 ){
        if ( ( ret = poll(fds, 2, TIMEOUT * 1000) ) == -1 ){
            perror("poll");
            exit(EXIT_FAILURE);
        }
        if ( ! ret )
            continue;
    //  printf("%d streams avaible\n", ret);
        if ( ret == 1 ){
            if ( fds[0].revents & POLLIN ){
                if ( ( ret = read(fd, buf, BUF_LEN - 1) ) == -1 ){
                    perror("read");
                    exit(EXIT_FAILURE);
                }
                if ( ! ret )
                    continue;
                buf[ret] = '\0';
                nSec = time(NULL);
                pTm = localtime(&nSec);
                system("clear");
                printf("Press ENTER when done.\n");
                printf("Last data in file %s at %s\n%s", argv[1], asctime(pTm), buf);
            }
        }
        else if ( fds[1].revents & POLLIN ){
            close(fd);
            read(STDIN_FILENO, buf, BUF_LEN - 1);
            break;
        }
    }
    
    exit(EXIT_SUCCESS);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.08.2010, 08:00     Динамически изменяющаяся строка
Еще ссылки по теме:

Динамически созданные кнопки C++ Builder
C++ Builder Удаление компонентов динамически
Visual C++ ProgressBar не меняется динамически
C++ Если память для объекта выделяется динамически (строка 33), сортировка sort не работает
C++ Builder Добавление кнопок динамически

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
accept
4817 / 3237 / 165
Регистрация: 10.12.2008
Сообщений: 10,682
07.08.2010, 08:00     Динамически изменяющаяся строка #8
Цитата Сообщение от Alexoy
чтоб содержание файла отображалось на одном и том же месте во время работы программы
да это нужно экран перехватить, в ncurses есть готовые функции и перехват упрощён (там есть что-то вроде gotoxy() даже)
а вывод определённого места файла можно организовать через символьный двумерный массив (его можно заполнять по алгоритму)
Yandex
Объявления
07.08.2010, 08:00     Динамически изменяющаяся строка
Ответ Создать тему
Опции темы

Текущее время: 19:54. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru