Добрый день!
Вопрос, наверное, ламерский, но все же, подскажите.
Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ. Надо, чтобы он не выводился, как, если бы мне надо было ввести пароль. Но идея состоит не в этом, просто у меня stdin и stdout связаны с com портом, а конкретнее, с модемом. Получается, что все символы, приходящие от удаленного модема возвращаются ему назад. А это для меня плохо.
Может кто знает, как сделать такое?
> Добрый день!
> Вопрос, наверное, ламерский, но все же, подскажите.
> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.Кривой у вас что-то, getchar не занимается выводом на экран.
>> Добрый день!
>> Вопрос, наверное, ламерский, но все же, подскажите.
>> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.
> Кривой у вас что-то, getchar не занимается выводом на экран.Может быть и кривой
Freebsd 8.2
gccВот текст программы:
----------------------------------
#include <stdio.h>int main ()
{ char buf [256];
int ch, pnt;
pnt = 0;
while ((ch = getchar()) != EOF)
{ buf [pnt] = ch + 1;
if (ch == 10)
{ buf [pnt] = 0;
puts (buf);
pnt = 0;
}
else pnt ++;
}
}
---------------------------------------Если после запуска программы ввожу с клавиатуры
12345
то на экране будут две строки
12345
23456
Проясните, пожалуйста, откуда берется строка
12345
ведь, едиственный оператор вывода это pus (buf), который выводит строку
23456
Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится введенный символ.
Вопрос, как это подавить?
>[оверквотинг удален]
> { buf [pnt] = ch + 1;
> if (ch == 10)
> { buf [pnt] = 0;
> puts (buf);
> pnt = 0;
> }
> else pnt ++;
> }
> }
> ---------------------------------------puts (buf); - вот он гад
>[оверквотинг удален]
> то на экране будут две строки
> 12345
> 23456
> Проясните, пожалуйста, откуда берется строка
> 12345
> ведь, едиственный оператор вывода это pus (buf), который выводит строку
> 23456
> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
> введенный символ.
> Вопрос, как это подавить?Не выводить на stdout!!!
>[оверквотинг удален]
>> то на экране будут две строки
>> 12345
>> 23456
>> Проясните, пожалуйста, откуда берется строка
>> 12345
>> ведь, едиственный оператор вывода это pus (buf), который выводит строку
>> 23456
>> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
>> введенный символ.
>> Вопрос, как это подавить?В смысле виноват puts?
>[оверквотинг удален]
>>> 12345
>>> 23456
>>> Проясните, пожалуйста, откуда берется строка
>>> 12345
>>> ведь, едиственный оператор вывода это pus (buf), который выводит строку
>>> 23456
>>> Поэтому делаю вывод, что при нажатии клавиши на stdout сразу же выводится
>>> введенный символ.
>>> Вопрос, как это подавить?
> В смысле виноват puts?Ну что значит виноват, у него миссия такая - выводить на stdout,
от начала адреса указываемое в аргументе.if (ch == 10) - ждет кода 0x0A, он жe LF, он же '\n', он же ENTER
> Добрый день!
> Вопрос, наверное, ламерский, но все же, подскажите.
> Обращаюсь с функции getchar(), а на экран при этом выаодится нажатый символ.
> Надо, чтобы он не выводился, как, если бы мне надо было
> ввести пароль. Но идея состоит не в этом, просто у меня
> stdin и stdout связаны с com портом, а конкретнее, с модемом.
> Получается, что все символы, приходящие от удаленного модема возвращаются ему назад.
> А это для меня плохо.
> Может кто знает, как сделать такое?struct termios settings;
tcgetattr(0, &settings);
//не отображаем введённые символы
settings.c_lflag &= ~ECHO;
//не ждём нажатия интер
settings.c_lflag &= ~ICANON;
tcsetattr(0, TCSANOW, &settings);
>[оверквотинг удален]
>> Получается, что все символы, приходящие от удаленного модема возвращаются ему назад.
>> А это для меня плохо.
>> Может кто знает, как сделать такое?
> struct termios settings;
> tcgetattr(0, &settings);
> //не отображаем введённые символы
> settings.c_lflag &= ~ECHO;
> //не ждём нажатия интер
> settings.c_lflag &= ~ICANON;
> tcsetattr(0, TCSANOW, &settings);Спасибо, сейчас попробую!
А на версию с puts приготовил программу другую
---------------------------------------------------
#include <stdio.h>int main ()
{ char buf [256];
int ch, pnt;
FILE *fl;
fl = fopen ("qq", "w");
pnt = 0;
while ((ch = getchar()) != EOF)
{ buf [pnt] = ch + 1;
if (ch == 10) break;
pnt ++;
}
buf [pnt] = 0;
fputs (buf, fl);
fclose (fl);
}
---------------------------------------------------В ней нет puts, а есть fputs, а эффект тот же.
> а эффект тот же.# echo "1111" | ./a.out
# cat qq
2222нету эффекта
-----
Можно вопрос: Напурква нужно buf[pnt] = ch + 1;
> Можно вопрос: Напурква нужно buf[pnt] = ch + 1;А для того, чтобы различать, что ввожу,а что вывожу
Всем большое спасибо за помощь.
Все получилось с tcgetattr и tcsetattr.
А то замучился фильтровать сообщения, ведь я работал не с клавиатуры,а через модем с удаленным сервером.