Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 3

Программа ждет 5 секунд ввода номера строки, если ввод не происходит, выводится весь файл

19.05.2015, 08:43. Показов 1184. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
программа ждет 5 секунд ввода номера строки,если ввод не происходит, выводится весь файл.
Может возникнуть проблема,когда между

C
1
2
3
if (scanf("%d",&line_no) != 0)
        {       
             signal(SIGALRM, SIG_IGN);
сканфом и блокироковкой сигнала все-таки сигнал пройдет и все выведется. Насколько я поняла, это проблема из параллельного программирования. Из-за чего это возникает в общем случае, а не на примере сканфа в этой программе?

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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#include <stdio.h>
 #include <unistd.h>
 #include <stdlib.h>
 #include <fcntl.h>
 #include <unistd.h>
 #include<sys/types.h>
 #include <string.h>
 #include<signal.h>
 
 #define BUFSIZE 257
 
    off_t displ[100];
    char* str;
        int fd1, fd2, i = 1, j = 0, line_no, line_ln[100];
        char c, buf[BUFSIZE];
        static char err_msg[32] = "Input file - ";
        ssize_t readed;
    struct sigaction act;
    sigset_t set;
void  ALARMhandler(int sig)
{
        lseek(fd2, SEEK_SET, SEEK_SET);
        while((readed = read(fd2, buf, BUFSIZE)) > 0)
        write(STDOUT_FILENO, buf, readed);
        exit(0);
}
 
int main(int argc, char *argv[])
 {
    
     if ((fd1 = open("/dev/tty", O_RDONLY | O_NONBLOCK)) == -1) 
     {
         perror("/dev/tty");
         exit(1);
     }
 
     if ((fd2 = open(argv[1], O_RDONLY)) == -1) 
     {
         perror(strcat(err_msg, argv[1]));
         exit(1);
     }
     displ[1] = 0;
 
     while(read(fd2, &c, 1))
         if( c == '\n' ) 
        {
            j++;
            line_ln[i] = j;
            i++;
            displ[i] = lseek(fd2, 0, 1);
            j = 0;
                 }
         else
             j++;
 
 
     while (printf("you have 5 seconds to enter a line number\n"))
    {    
        signal(SIGALRM, ALARMhandler);    
            alarm(5);
        sigemptyset(&set);             
        memset(&act, 0, sizeof(act));   
        act.sa_handler = ALARMhandler;
        act.sa_mask = set;
            if (scanf("%d",&line_no) != 0)
        {       
             signal(SIGALRM, SIG_IGN);
            exit(0);
                if(line_no == 0)
                exit(0);            
                if ((line_no>=i)||(line_no<0))
                {
                            fprintf(stderr, "Bad Line Number\n");
                    continue;   
                }
                else
                {
                            lseek(fd2, displ[line_no], 0);
                            if(read(fd2, buf, line_ln[line_no]))
                            write(STDOUT_FILENO, buf, line_ln[line_no]);
                        }
            }
 
        }
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.05.2015, 08:43
Ответы с готовыми решениями:

Программа не ждет ввода k
Программу писал на обычном Pascal.ABC, но у .NET есть возможность создавать ехешники, поэтому перешел на неё. Вставил туда код этой...

После ввода строки ничего не происходит, а программа закрывается
uses crt; Var i,p:integer; s:string; Begin write('Vvedite stroky: '); readln(s); p:=0; For i:=1 to Length(s)...

Какого ввода ждет еще эта программа?
#include &lt;stdio.h&gt; #include &lt;locale.h&gt; int main (void) { setlocale (LC_ALL,&quot;Rus&quot;); int n, m; // размеры массива ...

3
599 / 421 / 136
Регистрация: 02.10.2008
Сообщений: 1,796
Записей в блоге: 1
25.05.2015, 18:43
Может стоить посмотреть в сторону select()
0
0 / 0 / 0
Регистрация: 19.05.2015
Сообщений: 3
25.05.2015, 21:56  [ТС]
программу не нужно переделывать. нужно ответить, почему может возникнуть ошибка
0
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.05.2015, 22:49
http://linux.die.net/man/3/scanf

Return Value
...
EOF is also returned if a read error occurs, in which case the error
indicator for the stream (see ferror(3)) is set, and errno is set indicate
the error.
...
EINTR
The read operation was interrupted by a signal; see signal(7).
Другими словами, многие функции ввода-вывода выдают EINTR в том случае, если их прервали сигналом. В данном случае нужна дополнительная ветка для проверки результата на равенству EOF'у и дальнейшая проверка errno. К параллельному программированию отношения не имеет. Если я правильно понял вопрос
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.05.2015, 22:49
Помогаю со студенческими работами здесь

Программа выполнена , но ждет продолжения ввода (getline)
есть код int main() { setlocale(0, &quot;&quot;); using namespace std; string text; string done = &quot;done&quot;; string a; int...

Ввести с клавиатуры строку символов.Признак окончания ввода строки - нажатие клавиши 'ввод'.Программа должна определить длину введенной строки L
Помогите пожалуйста:gbye: Ввести с клавиатуры строку символов.Признак окончания ввода строки - нажатие клавиши 'ввод'.Программа должна...

Программа ждет ввода числа и в зависимости от количества цифр в числе выдает сообщение об их разрядности: трехзначное, пятизначное и т.д
1) Программа ждет ввода числа и в зависимости от количества цифр в числе выдает сообщение об их разрядности: трехзначное, пятизначное и...

Программа должна искать в текстовом файле строчку и если она есть вывести весь текстовый файл в memo (Где ошибка?)
procedure TForm16.Button2Click(Sender: TObject); var f,g:textfile; poisk,s:string; i:integer; begin memo1.Clear; ...

Апач ждёт 128 секунд
Всем привет! Установил на локальный компьютер (Linux Mint) копию корпоративного сайта для дебага. На нём уже стоял Apache (2.4.33 и PHP...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru