реклама на сайте
подробности

 
 
> Как симитировать конец потока символов (EOF), В Си
Motion
сообщение Oct 11 2009, 18:26
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Код подсчитывает количество введённых символов.
Код
#include <stdio.h>

int main(void)

{

    long nc;
    int c;
    nc=0;
    while((c=getchar())!=EOF)
        ++nc;

    printf("%ld/n", nc);

return 0;
    }


После компиляции запускается окно (console application). Начинаю вводить разные символы, нажимаю Enter, пробелы и т.д. А как симитировать EOF чтобы программа наконец вышла из цикла while() и вывела результат?
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 17)
тау
сообщение Oct 11 2009, 18:33
Сообщение #2


.
******

Группа: Участник
Сообщений: 2 424
Регистрация: 25-12-08
Пользователь №: 42 757



в стародавние времена ДОСа вроде бы спасала комбинация клавишей CTRL+Я
если склероз не попутал
Go to the top of the page
 
+Quote Post
Hellper
сообщение Oct 11 2009, 18:36
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 217
Регистрация: 13-08-07
Из: Санкт-Петербург
Пользователь №: 29 745



не... поспешил

Сообщение отредактировал Hellper - Oct 11 2009, 18:40


--------------------
Go to the top of the page
 
+Quote Post
rezident
сообщение Oct 11 2009, 19:21
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Удерживая ALT, на доп. цифровой клаве набрать 255.
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 11 2009, 19:34
Сообщение #5


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



ctrl-c, или ввод из файла сделать, направив содержимое файла в stdin программы ("программа.exe <файл_с_текстом.txt")
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 11 2009, 19:44
Сообщение #6


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Владимир_КПИ @ Oct 11 2009, 21:26) *
Код
    printf("%ld/n", nc);
"%ld\n"

Цитата(Владимир_КПИ @ Oct 11 2009, 21:26) *
А как симитировать EOF чтобы программа наконец вышла из цикла while() и вывела результат?

В DOS и Win* консоли - Ctrl-Z или, что то же самое, Alt-26 в начале строки (после чего всё равно надо ENTER, так как ввод построчно-буферизованный).
В Linux - Ctrl-D (ASCII EOT aka КП - "КонецПередачи")


Цитата(SysRq @ Oct 11 2009, 22:34) *
ctrl-c
и программа вывалится на getchar-е не дойдя до printf


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 11 2009, 19:51
Сообщение #7


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(ReAl @ Oct 11 2009, 23:44) *
и программа вывалится на getchar-е не дойдя до printf
Да, вы правы! У меня срабатывает, но это частный случай.
Go to the top of the page
 
+Quote Post
Motion
сообщение Oct 12 2009, 18:28
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Цитата
"%ld\n"

Да, верно. При компиляции заметил.

Цитата
В DOS и Win* консоли - Ctrl-Z или, что то же самое, Alt-26 в начале строки (после чего всё равно надо ENTER, так как ввод построчно-буферизованный).
В Linux - Ctrl-D (ASCII EOT aka КП - "КонецПередачи")

Исчерпывающий ответ. Спасибо.
Go to the top of the page
 
+Quote Post
ReAl
сообщение Oct 12 2009, 20:24
Сообщение #9


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(Владимир_КПИ @ Oct 12 2009, 21:28) *
Исчерпывающий ответ. Спасибо.
Вдогонку - это не "в С", это "в ОС".
Т.е. в dos/win
Эскизы прикрепленных изображений
Прикрепленное изображение
 


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
Motion
сообщение Oct 30 2009, 18:33
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Цитата
после чего всё равно надо ENTER, так как ввод построчно-буферизованный


А вот тут возникли дополнительные вопросы.

Например здесь:
Код
#include <stdio.h>

int main(void)

{
int ch;

while ((ch=getchar())!=EOF)
{
putchar(ch);
}

return 0;
    }


у меня построчно-буферизированый ввод. Нажму Enter - введённые символы передаются программе.


А вот в этой программе он не построчно-буферизированый:

CODE
#include <stdio.h>

int main(void)

{

long newline, tab, space;
int c,chars;
chars=0;
newline=0;
tab=0;
space=0;
while((c=getchar())!=EOF)
{
++chars;
if(c==10)
++newline;
if(c==9)
++tab;
if(c==32)
++space;
}
printf("%d characters\n",chars);
printf("%ld new lines\n", newline);
printf("%ld tabs\n",tab);
printf("%ld spaces\n", space);

return 0;
}


Нажму Enter - у меня происходит переход на новую строку. И лишь после имитации EOF - введённые символы передаются на обработку программе. Почему в первой программе построчно-буфферизированый ввод, а во второй - нет?
Причина редактирования: Оформление цитат исходников.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Oct 30 2009, 21:22
Сообщение #11


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Владимир_КПИ Во второй программе тоже буферизированный ввод. После нажатия nl выполняется тело цикла и дальше снова "висяк" на getchar. По EOF просто выводятся рузультаты.
Go to the top of the page
 
+Quote Post
Motion
сообщение Oct 30 2009, 21:40
Сообщение #12


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Цитата
Во второй программе тоже буферизированный ввод. После нажатия nl выполняется тело цикла и дальше снова "висяк" на getchar. По EOF просто выводятся рузультаты.

Теперь понял. Спасибо.

Задача: напишите программу для копирования входного потока в выходной с заменой знаков табуляции на \t, символов возврата назад (Backspace) на \b, а обратных косых чёрт - на \\. Это сделает табуляции и символы возврата легко читаемыми в потоке.

А как это должно быть? Например нажимаю табуляцию и программа сразу делает подмену в реальном времени (то есть не буферизированный ввод) или я ввожу множество символов, знаков табуляции, возвратов назад, косых чёрт и только при нажатии EOF программа всё это преобразует с подменой?
Go to the top of the page
 
+Quote Post
baralgin
сообщение Oct 30 2009, 22:30
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Задача не совсем ясна. Знак табуляции это и есть '\t'. И как ловить backspace при буферизированном вводе тоже не ясно... Без последнего я вижу разве что это:
Код
    int c;
    do
    {
        switch( c = fgetc(stdin) )
        {
            case '\t':
                putchar('\\'), putchar('t');
                break;
            case '\\':    
                putchar('\\'), putchar('\\');
                break;
            default:
                putchar(c);
        }
    } while ( c != EOF );


Насчёт реального времени ничего в задании не сказано, поэтому считаем что не нужно. Иначе я вижу только GetStdHandle и ReadFile, но наверное это грех в данном случае smile.gif .
Go to the top of the page
 
+Quote Post
Motion
сообщение Oct 31 2009, 08:47
Сообщение #14


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



А возможна работа программы в небуферизированом режиме?
Go to the top of the page
 
+Quote Post
SysRq
сообщение Oct 31 2009, 10:53
Сообщение #15


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



getch(), _getch()
Go to the top of the page
 
+Quote Post
Motion
сообщение Oct 31 2009, 18:58
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 466
Регистрация: 23-07-07
Из: Киев
Пользователь №: 29 297



Цитата
getch(), _getch()


Получилось, только дополнительно необходимо подключить библиотеку conio.h.
Go to the top of the page
 
+Quote Post
baralgin
сообщение Oct 31 2009, 21:24
Сообщение #17


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



С функциями типа _getch/e() есть небольшая загвоздка - они не работают с stdin(и с stdout похоже тоже), а читают нажатия из буффера клавиатуры. К примеру такая программа:
Код
int main()
{
    int ch;
    while ((ch=getchar())!=EOF) putchar(ch);
    return 0;
}

при вызове таким образом: progname.exe < sometext.txt
Выведеть в консоль содержимое файла sometext.txt . Но если заменить getchar на _getch то ничего выведено не будет. Собственно _getch и EOF не возвращает wink.gif .
Использовать или нет зависит от задачи.

Владимир_КПИ если вы просто изучаете язык си, то я бы посоветовал не заострять внимания на этом моменте. Для полноценного изучения достаточно освоить вывод (имхо, конечно).

PS: http://ru.wikipedia.org/wiki/Conio.h
Go to the top of the page
 
+Quote Post
sigmaN
сообщение Nov 1 2009, 23:46
Сообщение #18


I WANT TO BELIEVE
******

Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751



а чё, просто if( сh=='\t' ) ch = '\'; а следующий ch = 't'; в зависимости от того, куда это всё складывается. Вот и будет вам замена находу.
А уже реализовать это можно по всякому..
Ну а ежели построчно буферизированный ввод, тогда после ввода перебрать поступивший массив на наличие '\t' и точно так-же произвести замену.
Удобнее всего делать это, копируя в другой массив. Будет перерасход памяти, но для начала пойдет. Да и для конца тоже smile.gif


--------------------
The truth is out there...
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01548 секунд с 7
ELECTRONIX ©2004-2016