Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
5 / 5 / 0
Регистрация: 07.07.2010
Сообщений: 80
1

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

06.08.2010, 02:01. Просмотров 1027. Ответов 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 много таких программ.. когда под строкой-предложением ввести новую команду работает программа и ничего никуда не убегает
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.08.2010, 02:01
Ответы с готовыми решениями:

Изменяющаяся окружность
Помогите составить программу в PascalABC Составьте программу по следующему сценарию: в центре...

Изменяющаяся окружность.
в центре экрана расположена окружность радиусом 60 пикселей. При нажатии на кнопку вверх окружность...

Изменяющаяся иконка в SystemTray
У меня вопрос по сабжу, может кто сталкивался? Хотелось, чтобы иконка периодически (событие в...

Изменяющаяся синусойда на stm32f407
Здравствуйте Хочу сделать синусойду от 0 Гц до 50 Гц за 60 секунд. В примере который ниже сделана...

7
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
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'
2
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10880 / 6770 / 1620
Регистрация: 25.07.2009
Сообщений: 12,485
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");
0
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" - на один символ назад?!

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

Добавлено через 16 минут
Хм.. наверное название всё же не совсем правельное.. "строка" на "текст" можно было заменить.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
10880 / 6770 / 1620
Регистрация: 25.07.2009
Сообщений: 12,485
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);
}
0
4849 / 3270 / 466
Регистрация: 10.12.2008
Сообщений: 10,569
07.08.2010, 08:00 8
Цитата Сообщение от Alexoy
чтоб содержание файла отображалось на одном и том же месте во время работы программы
да это нужно экран перехватить, в ncurses есть готовые функции и перехват упрощён (там есть что-то вроде gotoxy() даже)
а вывод определённого места файла можно организовать через символьный двумерный массив (его можно заполнять по алгоритму)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.08.2010, 08:00

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Не изменяющаяся индексация базы
Здравствуйте товарищи! Возникла проблема с индексацией базы, а именно: после перестройки или...

Изменяющаяся ширина RelativeLayout
Здравствуйте, подскажите пожалуйста, вот слева есть RelativeLayout с фиксированной шириной 130 dp,...

Если память для объекта выделяется динамически (строка 33), сортировка sort не работает
Если память для объекта выделяется динамически (строка 33), сортировка sort не работает, если...

Область изменяющаяся при изменении окна
Здравствуйте! Подскажите, при создании элемента(области) можно ли в свойствах настроить что бы...

Каждой динамически созданной кнопке свой динамически созданный PictureBox
Добрый день. Надеюсь, что пишу в тот раздел. Находил немного похожие темы: каждая созданная кнопка...

Как динамически создать массив из динамически конструируемых экземпляров класса?
Есть два класса.Подразумевается ,что первый в конструкторе выделяет интовый массив длинной n,второй...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.