powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
49 сообщений из 49, показаны все 2 страниц
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38621024
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Не нашёл в интернете информацию по этим функциям. Я понял что getchar слушает пользователя. Это ерунда.

1. Они(гэтчар, путчар) работают со стандартными потоками ?
2. Эти потоки имеют дексрипторы 0 и 1 и их зовут stdin и stdout ?
3. Эти потоки используют все выполняющиеся процессы ? (наверное нет, но тогда ответы на два первых вопроса тоже нет)
4. Как происходит получение символа функцией int getchar () ?
Эта функция не принимает ничего, значит она(getchar) возможно обёртка для другой функции, которая принимает указатель на какой-то общий буфер для потока программы. И этот указатель по видимому двигается. Значит буфер этот реализован, вероятно, как LIFO. Это только мои догадки. Чтобы бы не подумали что я не думаю, а сразу спрашиваю вас
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38621039
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Не нашёл в интернете информацию по этим функциям. Я понял что getchar слушает пользователя. Это ерунда.

1. Они(гэтчар, путчар) работают со стандартными потоками ?
2. Эти потоки имеют дексрипторы 0 и 1 и их зовут stdin и stdout ?
3. Эти потоки используют все выполняющиеся процессы ? (наверное нет, но тогда ответы на два первых вопроса тоже нет)
4. Как происходит получение символа функцией int getchar () ?
Эта функция не принимает ничего, значит она(getchar) возможно обёртка для другой функции, которая принимает указатель на какой-то общий буфер для потока программы. И этот указатель по видимому двигается. Значит буфер этот реализован, вероятно, как LIFO. Это только мои догадки. Чтобы бы не подумали что я не думаю, а сразу спрашиваю вас

1. Да.
2. Обычно да. Но не обязательно. Стандартных потоков может вообще не быть.
3. Если стандартные потоки вообще могут быть на машине и если запускающий процесс их создал - они будут во всех программах запущенных точно так-же.
4. http://linux.die.net/man/3/getchar
Правильно угадал. Обертка и есть. Читай ман.
А буфер этот называется stdin. Правда удивительно? :)
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38621063
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо :)
Linux man pagegetchar() is equivalent to getc(stdin).


К чему эта инкапсуляция(. Ни к чему. На мой взгляд абсолютно тут не нужна, затрудняет понимание работы.Мне бы код этого getc, сейчас до конца изучу вашу ссылку
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38621085
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryи их зовут stdin и stdout ?stderr незаслуженно забыли
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38623890
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для каждой запущенной программы (процесса/потока) будет свой отдельно выделенный стандартный поток ввода/вывода/ошибок(точнее три потока). И каждый процесс видит только свои три потока ? Или эти три потока используют одновременно все ?

Узнал что getc реализован как макрос. У меня такое чувство, что когда реализацией будет какой-нибудь ассемблерный код.

Нашёл в следующую строчку
Код: plaintext
1.
int     _EXFUN(getc, (FILE *));


Вчера была математика, потому не занимался и не узнал ничего нового.

PS
Дмитрий, я заказал в краевой библиотеке книгу, что вы мне советовали, алгоритмические трюки для программиста. Сегодня позвонили, просят прийти и забрать C: в предвкушении
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38623891
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или эти три потока используют одновременно все запущенные процессы? *
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38623914
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДля каждой запущенной программы (процесса/потока) будет свой отдельно выделенный стандартный поток ввода/вывода/ошибок(точнее три потока). И каждый процесс видит только свои три потока ? Или эти три потока используют одновременно все ?
Изнутри программы есть три потока остальное ей неизвестно. Общие они будут или персональные - решает тот кто запускает программу. Например поток вывода нескольких программ может быть выведен в одну консоль или в один файл.
Тоже самое со вводом: стандартно он берется с клавиатуры (она обычно одна, т.е. общая), но можно вместо нее дать файл, он будет персональным потоком ввода.

SashaMercuryУзнал что getc реализован как макрос. У меня такое чувство, что когда реализацией будет какой-нибудь ассемблерный код.
Перечитай вышенаписанное и подумай сколько кода надо чтобы все это реализовать? Ты все еще хочешь во все это заглянуть? :)

SashaMercuryДмитрий, я заказал в краевой библиотеке книгу, что вы мне советовали, алгоритмические трюки для программиста. Сегодня позвонили, просят прийти и забрать C: в предвкушении
Изучай, только я вроде советовал "Искусство программирования" Кнута.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624010
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercuryДля каждой запущенной программы (процесса/потока) будет свой отдельно выделенный стандартный поток ввода/вывода/ошибок(точнее три потока). И каждый процесс видит только свои три потока ? Или эти три потока используют одновременно все ?
Изнутри программы есть три потока остальное ей неизвестно. Общие они будут или персональные - решает тот кто запускает программу. Например поток вывода нескольких программ может быть выведен в одну консоль или в один файл.
Тоже самое со вводом: стандартно он берется с клавиатуры (она обычно одна, т.е. общая), но можно вместо нее дать файл, он будет персональным потоком ввода.

SashaMercuryУзнал что getc реализован как макрос. У меня такое чувство, что когда реализацией будет какой-нибудь ассемблерный код.
Перечитай вышенаписанное и подумай сколько кода надо чтобы все это реализовать? Ты все еще хочешь во все это заглянуть? :)

SashaMercuryДмитрий, я заказал в краевой библиотеке книгу, что вы мне советовали, алгоритмические трюки для программиста. Сегодня позвонили, просят прийти и забрать C: в предвкушении
Изучай, только я вроде советовал "Искусство программирования" Кнута.

У, Кнута он только к пенсии осилит...
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624156
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryДмитрий, я заказал в краевой библиотеке книгу, что вы мне советовали, алгоритмические трюки для программиста. Сегодня позвонили, просят прийти и забрать C: в предвкушении
Там обычные советы по целочисленной оптимизации. Например - как быстро посчитать
квадратный корень из DWORD или посчитать количество единичных битов.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624166
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonТам обычные советы по целочисленной оптимизации
это всяко интереснее, чем gechar разбирать
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624285
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivУ, Кнута он только к пенсии осилит...
Постараюсь не отстать от этого графика ;)
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624299
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima_TИзучай, только я вроде советовал "Искусство программирования" Кнута.
Зимой, когда я спрашивал про смысл операции x&(x-1), советовали эту книгу, все записано :D С Кнутом попозже познакомлюсь поближе ;)
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624311
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С потоками понятно, спасибо.
Dima_TПеречитай вышенаписанное и подумай сколько кода надо чтобы все это реализовать? Ты все еще хочешь во все это заглянуть? :)

Очень хочу заглянуть и понять
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624430
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryMasterZivУ, Кнута он только к пенсии осилит...
Постараюсь не отстать от этого графика ;)

С твоей-то дотошностью... Кнут-то зануда редкостный.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624474
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Саш. Ты реально потонешь в этом потоке информации. Ты вообще определись что
нужно. Потому как копать Ассемблер с Абелем это вообще - другие ворота. Да и устарел
он лет на 10-15.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624873
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В математике есть теория чисел, топология, вычислительная математика и много много всего. Но дифференциальные уравнения бесспорно вершина. Так и тут, есть куча всего, я видел не так много, но Си мне нравится так-же сильно как и ДУ. Мне кажется это золотая середина между высокоуровневыми языками и машинным кодом. Но чтобы его изучить, приходится разбираться во многом. Потому архитектуру системы команд и систему команд тоже нужно изучить. Вот и тянутся эти книги. Я не могу изучать Си не понимая как работает getc. И не зная что sizeof это просто красивое название машинной команды, например. Нужно разобраться как работает эта функция,точнее макрос, а я даже код не смог найти. Плохо искал наверное, завтра попробую. Меня выгоняют :(
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38624879
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На этом, думаю стоит закончить топик.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38625278
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Перенесите пожалуйста в программирование. Я уже разобрался как дизассемблировать программу. И даже дизассемблировал
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
#include <stdio.h>

int main(int argc, char** argv)
{
	putchar(48);
	int a=getc(stdout);
	return 0;
}



Код получился такой

Код: xml
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.
#include <stdio.h>

int main(int argc, char** argv)
{
00D713C0  push        ebp  
00D713C1  mov         ebp,esp //esp-вершина стека *ebp=*esp  
00D713C3  sub         esp,0CCh  
00D713C9  push        ebx  
00D713CA  push        esi  
00D713CB  push        edi  
00D713CC  lea         edi,[ebp-0CCh]  
00D713D2  mov         ecx,33h  
00D713D7  mov         eax,0CCCCCCCCh  
00D713DC  rep stos    dword ptr es:[edi]  
	putchar(48);
00D713DE  mov         esi,esp                      //*esi=*esp сохраняю начало стека  
00D713E0  push        30h                          //*esp=30_h=48_10=0_ascii
00D713E2  call        dword ptr ds:[0D7911Ch]       //по этому адрсу: __IMPORT_DESCRIPTOR_KERNEL32+1h (...79h), пока не разобр. 
00D713E8  add         esp,4                        //esp+=4
00D713EB  cmp         esi,esp                     //return 4 ?
00D713ED  call        __RTC_CheckEsp (0D7113Bh) //по адресу jmp __RTC_CheckEsp (..610h)->esperror(...613h)->push ebp. не разобр.  
	int a=getc(stdout);
00D713F2  mov         esi,esp                    //*esi=*esp 
00D713F4  call        dword ptr ds:[0D79118h]  //вот тут то видимо pop и происходит. Пока не уверен, нужно идти, позже проверю
00D713FA  cmp         esi,esp  
00D713FC  call        __RTC_CheckEsp (0D7113Bh)  
00D71401  mov         ecx,20h  
00D71406  shl         ecx,0  
00D71409  add         eax,ecx  
00D7140B  mov         esi,esp  
00D7140D  push        eax  
00D7140E  call        dword ptr ds:[0D79110h]  
00D71414  add         esp,4  
00D71417  cmp         esi,esp  
00D71419  call        __RTC_CheckEsp (0D7113Bh)  
00D7141E  mov         dword ptr [a],eax  
	return 0;
00D71421  xor         eax,eax  
}
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38625384
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЯ уже разобрался как дизассемблировать программу.
полезнее изучить опции компилятора - получение ассемблерного листинга, отключение проверок стека и т д
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627278
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS
Код: html
1.
00D713F4  call        dword ptr ds:[0D79118h]  //вот тут то видимо pop и происходит. Пока не уверен, нужно идти, позже проверю




нет, там этого нет. Вот что расположено по этому адресу.
Код: html
1.
add         byte ptr [eax],al  



Изопропил, я не так выразился. С помощью компилятора и получил ассемблерный листинг, а не дизассемблировал. Поставил точки останова, и получил
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627283
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё что странно, putchar пишет в stdout 48_2, getchar читает из stdin 48_ascii, но по факту они, как я понял, работают с одним буфером. То есть stdin и stdout это псевдонимы одной области памяти. Правильно ли я понял ?
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627287
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Туплю,
http://linux.die.net/ getchar() is equivalent to getc(stdin)
getc() is equivalent to fgetc() except that it may be implemented as a macro which evaluates stream more than once.
fgetc() reads the next character from stream and returns it as an unsigned char cast to an int, or EOF on end of file or error.

putchar(c); is equivalent to putc(c,stdout).
putc() is equivalent to fputc() except that it may be implemented as a macro which evaluates stream more than once.
fputc() writes the character c, cast to an unsigned char, to stream.


putchar неявно работает с stdin, читает эта функция ведь по тому указателю ? ибо, откуда ещё ? а возвращает прочитанный символ в тот поток который принимает функция. Это верно ?
stdin -неудачное название
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627288
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SS
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <stdio.h>
int main(int argc, char** argv)
{	putchar(48);
	int a=getc(stdout);	
        return 0;
}




То есть эта программа написана некорректно, но она работает. Написал сейчас правильно, int a=getc(stdin); всё отработало, всё ок. Но тогда почему отработал и первый вариант ? Я пытался считать по указателю, по которому ничего не было записано. Снова прихожу к тому что stdin и stdout это одно и тоже (указатели-псевдонимы). Непонятно
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627311
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury,

Это все обертки, в итоге докопаешь до WinAPI для работы с консолью. Можешь сразу почитать документацию

Бросай это бесполезное занятие. Документацию для того и пишут чтобы каждый раз в чужие исходники не лезть.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627323
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут пример чтения средствами виндовса
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627335
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryС помощью компилятора и получил ассемблерный листинг, а не дизассемблировал. Поставил точки останова, и получил
это как раз дизассемблировал

с помощью компилятора - это с ключиком /FA (для MSVC)
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627340
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, вы меня убедили. Пока сильно углубляться не буду. Почитаю тот код что вы мне дали.

Ответьте только кто-нибудь хотя бы на этот вопрос, почему всё-таки код ниже отработал нормально ? Ведь правильно getc(stdin).
Код: plaintext
1.
2.
3.
4.
5.
6.
#include <stdio.h>
int main(int argc, char** argv)
{	putchar(48);
	int a=getc(stdout);	
        return 0;
}



Изопропил, нет, этого я не знал, вы правы
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627354
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryОтветьте только кто-нибудь хотя бы на этот вопрос, почему всё-таки код ниже отработал нормально ? Ведь правильно getc(stdin).
Не увидел ничего работающего. Твой код компилируется, но работает некорректно. Посмотри что в переменной a
Код: plaintext
1.
2.
3.
4.
5.
6.
int main(int argc, char** argv)
{	putchar(48);
	int a=getc(stdout);	
	printf("\n a=%d\n", a);
        return 0;
}


Я сразу получаю -1, если написать getc(stdin) то ждет ввода и в a вижу код символа.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627360
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не работает.
извините, я ошибся (
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627371
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И ещё, если это так важно, то почему бы это не сделать третьим параметром точки входа, fe
Код: plaintext
1.
int main(int argc, char** argv, char* stdin)



В реализации printf используются функции из семейства putc/getc ?
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627403
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryВ реализации printf используются функции из семейства putc/getc ?
Не в ту сторону копаешь. Си это язык со своим синтаксисом, функциями и т.д., но откомпилированная программа запускается и работает в какой-то ОС (например виндовс), и весь ввод-вывод осуществляет ОС, она непосредственно взаимодействует с устройствами (клавиатура, видеоадаптер и т.д.), а программам доставляет все в унифицированном виде, для того она и нужна чтобы ты писал printf(), а не самодельный драйвер под каждый тип видеоадаптера. Но т.к. в каждой ОС это реализовано по своему, то в итоге твоя программа использует API (application programming interface) этой ОС. Ссылка выше которую я давал это WinAPI для работы с консолью (черное окошко в котором ты свою программу видишь), можешь использовать WinAPI, но в другой ОС (например линукс) этот код не скомпилируется, т.к. там свое API. А printf() будет работать везде.

Вобщем printf() это функция которая формирует строку для вывода, а затем вызывает функции WinAPI чтобы эту строку вывести.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627633
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryИ ещё, если это так важно, то почему бы это не сделать третьим параметром точки входа, fe
Код: plaintext
1.
int main(int argc, char** argv, char* stdin)



В реализации printf используются функции из семейства putc/getc ?
Несмотря на концептуальность, функции ввода-вывода должны иметь
оптимизацию для блочных операций. Тоесть запись на диск блока в 512 байт
обычно не заменяют на 512 вызовов функции записи 1 байта. Это было-бы глупо.
Скорее всего там стоит блочная функция записи строки на устройство STDOUT.
Что конкретно - зависит от реализации стандартной библиотеки stdio. А она
зависит от ОС и компиллятора. Но помимо этого функция printf еще и делает
много операций по приведению формата. Это делает ее в десятки раз сложнее
чем к примеру puts(const char *str).
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38627870
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий, понял, сейчас этот хаос несколько упорядочился. Спасибо.
mayton, спасибо.

Ладно, видимо тут действительно не всё так просто. Прекращаю разбор putchar/getchar. Пока что прекращаю.
PS
Всё равно мне эти функции не нравятся. Небезопасные, как мне кажется, непонятно как реализованы, и не самые красивые.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38632772
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.

1. Классический код
Код: plaintext
1.
2.
3.
4.
5.
	int c;
	while (c = getchar())
	{
		putchar(c);
	}



Запустили программу. Написали строку, нажимаем Enter, ниже происходит вывод строки напечатанной выше. Хотя по-идее, я напечатал один символ, поместил его в stdin, далее считал его getchar(), и через putchar() сразу должен вывести на stdout. В моём случае, происходит ожидание, и только потом будет вывод всех введённых символов в строке. Что я упускаю ?

2. Пользуетесь ли вы в своей работе/жизни этими функциями явно?
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38632792
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury2. Пользуетесь ли вы в своей работе/жизни этими функциями явно?
Не нужны они вообще. Консольные приложения это обычно "роботы", т.е. программы не требующие какого-либо ввода данных с клавиатуры. Они просто запускаются и пишут на экран что делают.

Приложения для пользователя пишутся с использованием GUI, т.е. формы, окна, поля ввода и т.д., а там всё совсем по другому пишется.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38632801
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Классический код
Код: plaintext
1.
2.
3.
4.
5.
	int c;
	while (c = getchar())
	{
		putchar(c);
	}



Запустили программу. Написали строку, нажимаем Enter, ниже происходит вывод строки напечатанной выше. Хотя по-идее, я напечатал один символ, поместил его в stdin, далее считал его getchar(), и через putchar() сразу должен вывести на stdout. В моём случае, происходит ожидание, и только потом будет вывод всех введённых символов в строке. Что я упускаю ?

Установи Линукс, именно для того, чтобы побаловаться с этими функциями.
В *nix получишь именно то поведение, которое ожидаешь: ввод-вывод по одному символу сразу.
Тут сказывается различное поведение разных ОС. Винда буферизирует ввод.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38633024
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для меня нет программы красивее консольной C: Прикладные конечно используют GUI. Значит буферизация ? Хорошо, спасибо )
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38634083
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Сегодня экспериментировал. Подскажите пожалуйста
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
	FILE* f_in;
	const char* f_in_name = "1.txt";
	f_in = fopen(f_in_name, "r");
	if (f_in) //3
	{
		int b;
		while ((b=getc(f_in))!=EOF) //проверка не работает, шут с ней пока.
		{
			putc(b, stdout);//я так понимаю по дефайну stdout идёт к консоли
		}
		fclose(f_in);
	}



Почему-то в консоль не переставая печатаются неотображаемые символы. Странно. В файле как английские так и русские буквы.
1. Прочитал про функции указывающие на конец файла. Можно ли конец файла проверять аналогично указателям ?

Код: plaintext
1.
2.
3.
4.
while(*ptr)
{
smth do;
}



Я уже попробовал, нельзя. Жаль. Хотя что такое файл, как мне казалось. Просто кусок нулей и единиц, заканчивающийся признаком конца, и имеющий имя начала. Видимо ошибаюсь .
Может всё-таки можно, и я просто не знаю.
2. Почему ничего не выводится в консоль ?
3.1 Можно ли так проверять получил ли я ненулевой указатель на память ?
3.2 Я получаю реальный адрес файла , по которому я не могу обратиться через указатель ?
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38634110
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
getc, getwc :
Код: 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.
// crt_getc.c
// Use getc to read a line from a file.

#include 

int main()
{
    char buffer[81];
    int i, ch;
    FILE* fp;
    
    // Read a single line from the file "crt_getc.txt". 

    fopen_s(&fp, "crt_getc.txt", "r");
    if (!fp)
    {
       printf("Failed to open file crt_getc.txt.\n");
       exit(1);
    }

    for (i = 0; (i                          && (ch != '\n'); i++)
    {
        buffer[i] = (char) ch;
    }
       
    // Terminate string with a null character 
    buffer[i] = '\0';
    printf( "Input was: %s\n", buffer);

    fclose(fp);
}
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38634111
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury
Код: plaintext
1.
		while ((b=getc(f_in))!=EOF) //проверка не работает, шут с ней пока.


Ты сначала разберись и сделай чтоб заработало, а потом вопросы задавай.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38634162
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторМожет всё-таки можно, и я просто не знаю.
2. Почему ничего не выводится в консоль ?
Очень хочется ответить как Капитан Очевидность. Напиши printf("Hello World") и убедись что твоя консоль в порядке.
Прочие ошибки - твои собственные.

3.1 Можно ли так проверять получил ли я ненулевой указатель на память ?
Для работы с файлами существует файловое API. fopen, fread/fwrite, fclose, open, read/write, close
и надо использовать его. Каждая операция возвращает код ошибки.

Если fopen возвращает null то нужно его обязательно проверить. Если не будешь проверять
коды ошибок то будешь зачмырен своими коллегами по работе и рано или поздно будешь
больно бит.

Если ты пишешь софт только под Windows то лучше использовать Windows-specific file API.
Оно предоставляет больше возможностей по контролю ситуации именно в Windows файловой системе.

3.2 Я получаю реальный адрес файла , по которому я не могу обратиться через указатель ?

Вобщем нельзя но почитай здесь. Это альтернативное API.

http://ru.wikipedia.org/wiki/Отображение_файла_в_память
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38635152
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за ответы.

Dima_TТы сначала разберись и сделай чтоб заработало, а потом вопросы задавай.

Хорошо, сначала разберусь, вы правы. К сожалению сегодня нужно заниматься одной ерундой (
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38635153
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonОчень хочется ответить как Капитан Очевидность. Напиши printf("Hello World") и убедись что твоя консоль в порядке.

мне было понятно что консоль в порядке, и проблема в моём коде.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38636118
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
INTERNATIONAL STANDARD ©ISO/IEC ISO/IEC 9899:201x7.21.5.3 The fopen function
Synopsis
#include <stdio.h>
FILE *fopen(const char * restrict filename,
const char * restrict mode);


Всё-таки сначала надо разобраться нормально с типами данных, и с тем что значит restrict, прежде чем с fopen работать. Распечатал все типы данных, и информацию по restrict из стандарта. Буду читать
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38636120
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только не подсказывайте, сам хочу попробовать понять ;)
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38693927
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. С restrict полностью не разобрался, но я его добью. Зато решил уже попробовать FOPEN в действие, мне она нужна. Я хочу запускать программы и записывать результат их выполнения в другие файлы, уже мало консоли(одного файла привязанного к консоли). Ещё хочу попытаться пройтись по всем файлам на машине и поискать какой-нибудь текст например, просто интересно. А restrict постараюсь на выходных добить.

Посмотрите? какой чудесный код ниже, я перенаправляю поток из одного файла в другой C:

У меня только один вопрос. Как этот код написать ещё красивее. Оформить его правильно, скажем так. Или уже всё нормально.

#include <stdio.h>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
int main(int argc, char** argv)
{
	FILE* f1 = fopen("C:\\Files\\file1.txt","r");
	FILE* f2 = fopen("C:\\Files\\file2.txt", "w");

	if (f1 == NULL||f2==NULL)
	{
		printf("Can't open files");
	}
	else
	{
		int c;
		while ((c = getc(f1))!=-1)
		{
			putc(c, f2);
		}
	}
	return 0;
}




А вот тут странно, я ожидал увидеть в обоих файлах "TEST", в первом эти символы были, но было ещё куча Н, а во втором были только Н, на 4 килобайта. Странно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
#include <stdio.h>

int main(int argc, char** argv)
{
	FILE* f2 = fopen("C:\\Files\\file2.txt", "w");
	FILE* f1 = freopen("C:\\Files\\file1.txt","r+",stdout);
	
	printf("TEST");
	if (f1 == NULL||f2==NULL)
	{
		printf("Can't open files");
	}
	else
	{
		int c;
		while ((c = getc(f1))!=-1)
		{
			putc(c, f2);
		}
	}
	
	return 0;
}



мне кажется это связано с работой printf. Сейчас проверю.

Да, из-за этой функции. putc тоже плохо пошёл, эти Н везде. Значит эти функции всё-таки похожи по своей природе, как и предполагалось. А если попробовать привести их к void, как я часто видел, но так и не понял зачем.

Тоже не помогло. Дальше читать ? Что-то упустил ?
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38693961
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ещё решил потренироваться, и написал простую программу для подсчёта пробелов, табуляции, предложений, и др. Скажите пожалуйста, правильно я её решил сточки зрения декомпозиции задачи ? Можно ли как-нибудь хранить функции в структурах ? по идее функция это константный указатель на константу, потому вроде-бы можно. Однако правильно ли это ? Делаете ли вы так ?

Код: plaintext
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.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
#include <stdio.h>
#include <stdlib.h>

struct TextAttribute
{
	unsigned int count_spaces;
	unsigned int count_tabs;
	unsigned int count_newlines;
	unsigned int count_sentences;
};

struct TextAttribute* TextAttribute_create(unsigned int count_spaces, unsigned int count_tabs, unsigned int count_newlines, unsigned int count_sentences)
{
	TextAttribute* ta = (TextAttribute*)malloc(sizeof(struct TextAttribute));
	ta->count_newlines = count_newlines;
	ta->count_sentences = count_sentences;
	ta->count_spaces = count_spaces;
	ta->count_tabs = count_tabs;
	return ta;
}

/*
//Проверяет, может ли данный символ быть концом предложения
bool isSignEndSentence(int* c)
{
	return (*c == '.' || *c == '?' || *c == '!');
}

//Проверка на то, действительно ли это конец предложения (следующий символ после принимаемого не должен быть символом конца предложения). Частный случай - конец буфера.
bool isEndSentence(int* c)
{
	return (isSignEndSentence(c) && !isSignEndSentence(c + 1) || *(c + 1) == -1);
}

*/

struct TextAttribute* TextAttribute_set_for_file(struct TextAttribute* ta, FILE* f)
{
	if (f == NULL)
	{
		printf("Can't open file");
		return NULL;
	}//end if
	else
	{
		int count_characters = 0;
		int count_spaces_in_row = 0;
		int c;
		while ((c = getc(f)) != -1)
		{
			count_characters++;
			if (c == ' ')//считаю пробелы
			{
				ta->count_spaces++;
				count_spaces_in_row++;
				if (count_spaces_in_row==8)//считаю табуляцию
				{
					ta->count_tabs++;
					count_spaces_in_row = 0;
				}
				continue;
			}

			else if (c == '\n')//считаю новые строки
			{
				ta->count_newlines++;
				count_spaces_in_row = 0;
				continue;
			}
			else if (c=='.'||c=='!'||c=='?')//считаю новые предложения
			{
				ta->count_sentences++;
				count_spaces_in_row = 0;
				continue;
			}
		}// end while
		return ta;
	}//end else
}



int TextAttribute_view(struct TextAttribute* ta)
{
	if (ta == NULL)
	{
		printf("TextAttribute not exist");
		return -1;
	}
	printf("The text has the following characteristics: \n");
	printf("Number of spaces: %i\n", ta->count_spaces);
	printf("Number of tabs: %i\n", ta->count_tabs);
	printf("Number of new lines: %i\n", ta->count_newlines);
	printf("Number of sentences: %i\n", ta->count_sentences);
	return 1;
}


int main(int argc, char** argv)
{
	FILE* f = fopen("C:\\Files\\file1.txt","r");
	struct TextAttribute* f_ta = TextAttribute_create(0, 0, 0, 0);
	f_ta = TextAttribute_set_for_file(f_ta, f);
	TextAttribute_view(f_ta);

	return 0;
}
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38694016
RWolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryУ меня только один вопрос. Как этот код написать ещё красивее. Оформить его правильно, скажем так. Или уже всё нормально.

Файлы после завершения работы с ними надо закрывать, см. fclose.
Волшебные цифры в коде не нужны, есть константа EOF.

SashaMercuryМожно ли как-нибудь хранить функции в структурах ?

Можно.
...
Рейтинг: 0 / 0
Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
    #38694952
smald
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryЗдравствуйте.
Не нашёл в интернете информацию по этим функциям. Я понял что getchar слушает пользователя. Это ерунда.

1. Они(гэтчар, путчар) работают со стандартными потоками ?
2. Эти потоки имеют дексрипторы 0 и 1 и их зовут stdin и stdout ?
3. Эти потоки используют все выполняющиеся процессы ? (наверное нет, но тогда ответы на два первых вопроса тоже нет)
4. Как происходит получение символа функцией int getchar () ?
Эта функция не принимает ничего, значит она(getchar) возможно обёртка для другой функции, которая принимает указатель на какой-то общий буфер для потока программы. И этот указатель по видимому двигается. Значит буфер этот реализован, вероятно, как LIFO. Это только мои догадки. Чтобы бы не подумали что я не думаю, а сразу спрашиваю вас

Если нужно знать что делает, достаточно почитать стандарт C99.
Если нужно знать как делает, то лезем в исходники.
Например в GNU/Linux, смотрим glibc тут

Если вкратце, то стандартные функции ввода/вывода реализуют стандарт в поведении, и
сам ввод/вывод производят записью/чтением в файл устройства в /dev, которое назначено
устройством ввода/вывода в параметрах ядра. Можно изменить при загрузке, прописав параметр
console в grub.cfg, например так kernel /vmlinuz-XXX ro root=/dev/sdaY console=tty0 console=ttyS0,9600n8
Тогда стандартные IO функции из glibc будут писать весь IO через устройство /dev/tty0. Это устройство
будет открываться как файл для каждого создаваемого процесса, и его дескриптор, который отобразиться
в папке /proc/PID/fd, служит смещением в массиве структур file_operations, указатель на который имеется в структуре процесса,
называемой task_struct в ядре, и обозначает все открытые процессом файлы.
Стандартные IO функции в glibc производят обычные read/write с этим дескриптором, в read/write, передаётся управление
калбекам, прописанным в соотвествующей дескриптору file_operations ( тут прототип) которая предоставляется драйвером того устройства,
которая прописана в параметре console.
Таким образом весь ввод/вывод проходит через реализованные в этом драйвере функции ввода/вывода, и которые делать
могут далее что угодно, например писать в framebuffer видюхи, что /dev/tty0 и делает.
Для стадарных из libc функций есть, прописанное стандартом, поведение и рекомендации к реализации, по которому, в частности,
stdout и stdin в реализации представляют собой кольцевые буферы в юзерспайсе, из которого делается read/write в дескрипторы
файла из /dev, прописанного в console.
...
Рейтинг: 0 / 0
49 сообщений из 49, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Общие принципы работы программы. getchar, putchar , sdtin, stdout. Вопросы.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]