Память под ввод

Модератор: Fastman

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 13:07:54

Есть ли способ выделить память под указатель на char, ровно столько, сколько нужно (т.е. определить сколько ввёл пользователь в консоли символов, выделить память и записать в неё то, что ввёл пользователь). Я знаком лишь с другим методом: выделяю много памяти, считываю в неё, а потом (чтобы память не засирать) применяю string=realloc(string, strlen(string)), т.е. перевыделяю память, новая память не будет содержать пустого хвоста. Но все эти перевыделения - это действия, программа копирует строку в новое место, и стирает старое. Этот метод не выгоден по ресурсам. (это конечно смешые объёмы, но всё-же, хочется правильно писать проги).

Я тут попробывал вот что написать

Код: Выделить всё

void main() 
{ 
    char *string; 
    int i=0; 
    while (getchar()!='\n') i++; 
    string=malloc((i+1)*sizeof(char)); 
    fseek(stdin,0,SEEK_SET); 
    fscanf(stdin, "%s", string); 
    printf("%s", string); 
     
    getch(); 
} 
однако считать с потока ввода символы, введённые ранее не удаётся(
Последний раз редактировалось Antolflash 2008-12-27 13:56:37, всего редактировалось 1 раз.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 13:25:32

а по нормальному
выделяеться буффер определенного размера и в него пишеться все и анализируеться в нем же

зы
закрывающий тег [/]
кнопочки вверху

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 13:58:43

ПРивести пример кода не можете? Где храниться то, что я ввёл с клавиатуры, а потом нажал enter??? В буфере это уже не будет, так? Это будет в stdin или в stdout?? Почему не получается перевети каретку считывания файла в начало потока?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 14:03:32

давайте начнем с конечного решения
что вы хотите сделать

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 14:06:19

Я хочу просто записать то, что я ввёл с клавиатуры, в динамическую память ( назову этот указатель char *string), но при этом я хочу сразу выделить память под указатель ровно столько, сколько нужно, не больше.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 14:09:37

это ваш частный случай

заранее вы никогда несможете узнать скоко надо памяти

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 14:11:30

А я вот слышал, что всё, что я ввёл с клавиатуры записывается в буфер. Нельзя ли после нажатия enter прочесть буфер, и зная количесво символов выделить память и записать символы в эту память?

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 14:13:29

Правда scanf тут нельзя применить, заранеене выделив память, getchar пишет сразу в переменную, а не в буфер, так? Есть ли просто функция по открытию консоли и записи в буфер?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 14:18:42

А я вот слышал, что всё, что я ввёл с клавиатуры записывается в буфер. Нельзя ли после нажатия enter прочесть буфер, и зная количесво символов выделить память и записать символы в эту память?
пишете свою обертку на функцию
в которой выделяете буффер заранее большего размера
и перед выходом их функции сканируете размер и возращаете его

дальше юзаете
так как вам угодно
зная размер

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 14:24:30

Так этот буфер уже написан и выделен, он уже используется, это буфер ввода. Вот как с него считать? Scanf и getchar выталкивают буфер, а есть ли фугкция, которая просто открывает консоль и пишет в буфер?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 14:30:03

мы друг друга непонимаем

хотите понять в чем вы ошибаетесь
доберитесь до самого низу ОС
начиная от тойже scanf

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 14:48:01

Вы мне предлагаете понять stdio.h ? Это проблематично, я не понимаю, что значит #if и другие подобные #вещи, это как понять, что такая за директива к препроцессору? Я знаю только #define и #include. Ну и слегка вроде понял, что такое #pragma.
Так всё-таки, разве я не прав в том, что при печатании в консоли, всё записывается в буфер, а после нажатия enter, буфер выталкивается?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 15:00:35

вы пытаетесь понять как устроена ОС ?
или пытаетесь соптимизировать 10 строк вашей программы?

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 15:50:51

Хорошо, тогда вопрос таков: как считать символы, находящиеся в буфере (т.е. считывание из файла) сразу после нажатия enter?


Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 21:53:47

Вы мой вопрос не поняли, переформулирую. Как пересчитать все сиволы (их кол-во), которые лежат в буфере сразу после нажатия enter, но никуда их не записывать?

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 22:02:54

никак

либо если со scanf то можно strlen

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Память под ввод

Непрочитанное сообщение Fastman » 2008-12-27 22:23:56

Antolflash писал(а):Вы мой вопрос не поняли, переформулирую. Как пересчитать все сиволы (их кол-во), которые лежат в буфере сразу после нажатия enter, но никуда их не записывать?
Вы думайте прежде чем говорить.
Попытайтесь запомнить число не запоминая его :)
Главное в жизни здоровье и любовь, остальное я все куплю.

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-27 22:50:05

.Понимаете, если вы видите символы на экране, значит они содержатся в соответствующем файле, буфер уже выделен в stdio.h, вот только как добраться до него? Как после нажатия enter узнать количесво символов в буфере ввода, а затем выделить это кол-во памяти?

Аватара пользователя
Fastman
ст. лейтенант
Сообщения: 1236
Зарегистрирован: 2006-07-07 10:20:38
Откуда: Минск. РБ

Re: Память под ввод

Непрочитанное сообщение Fastman » 2008-12-27 23:05:38

Antolflash писал(а):.Понимаете, если вы видите символы на экране, значит они содержатся в соответствующем файле, буфер уже выделен в stdio.h, вот только как добраться до него? Как после нажатия enter узнать количесво символов в буфере ввода, а затем выделить это кол-во памяти?
Зачем ??? Объясните, зачем это вам ???
При написании софта ставится цель не минимальные ресурсы и велосипеды с оптимизацией.
Ставится цель написать в разумные сроки за определенные деньги работающий код - который можно к тому же еще и поддерживать силами стандартных программистов.
Главное в жизни здоровье и любовь, остальное я все куплю.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-27 23:07:18

Понимаете, если вы видите символы на экране, значит они содержатся в соответствующем файле, буфер уже выделен в stdio.h, вот только как добраться до него? Как после нажатия enter узнать количесво символов в буфере ввода, а затем выделить это кол-во памяти?
))
они содержаться в буффере операционной системы

Antolflash
рядовой
Сообщения: 46
Зарегистрирован: 2008-12-19 23:55:52

Re: Память под ввод

Непрочитанное сообщение Antolflash » 2008-12-28 1:15:27

Console Functions
Тут вроде есть простое открытие консоли для записи вникуда и операции анализа буфера ввода. Вот то, что требовалось сказать, нашёл это в msdn, нужную ссылку на другом форуме дали. Причём вопрос я сформулировал как надо, просто вы не захотели слушать вопрос.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: Память под ввод

Непрочитанное сообщение paradox » 2008-12-28 1:43:22

это типа все должны были догадаться что вы про виндовс говорите ?

к томуже такие проблемы как вы пытаетесь решить никто не решает
их просто избегают
проектируя саму программу правильно

о чем я и спросил с самого начала

Аватара пользователя
Aesthete Animus
рядовой
Сообщения: 33
Зарегистрирован: 2008-06-16 0:49:54

Re: Память под ввод

Непрочитанное сообщение Aesthete Animus » 2008-12-31 15:46:58

Вообще говоря, все гораздо проще, ибо есть уже открытые дескрипторы fileno(stdin)/fileno(stdout) (которые по посиксу равны 0 и 1 соответственно), которые доступны для записи/чтения стандартными read/write. Но афтору категормчкский низачот, ибо не зная ни язык, ни основ ввода вывода, хочет, что бы угадывали его гениальные мысли насчет оптимизации.