Страница 1 из 1

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

Добавлено: 2008-12-27 13:07:54
Antolflash
Есть ли способ выделить память под указатель на 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(); 
} 
однако считать с потока ввода символы, введённые ранее не удаётся(

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

Добавлено: 2008-12-27 13:25:32
paradox
а по нормальному
выделяеться буффер определенного размера и в него пишеться все и анализируеться в нем же

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

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

Добавлено: 2008-12-27 13:58:43
Antolflash
ПРивести пример кода не можете? Где храниться то, что я ввёл с клавиатуры, а потом нажал enter??? В буфере это уже не будет, так? Это будет в stdin или в stdout?? Почему не получается перевети каретку считывания файла в начало потока?

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

Добавлено: 2008-12-27 14:03:32
paradox
давайте начнем с конечного решения
что вы хотите сделать

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

Добавлено: 2008-12-27 14:06:19
Antolflash
Я хочу просто записать то, что я ввёл с клавиатуры, в динамическую память ( назову этот указатель char *string), но при этом я хочу сразу выделить память под указатель ровно столько, сколько нужно, не больше.

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

Добавлено: 2008-12-27 14:09:37
paradox
это ваш частный случай

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

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

Добавлено: 2008-12-27 14:11:30
Antolflash
А я вот слышал, что всё, что я ввёл с клавиатуры записывается в буфер. Нельзя ли после нажатия enter прочесть буфер, и зная количесво символов выделить память и записать символы в эту память?

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

Добавлено: 2008-12-27 14:13:29
Antolflash
Правда scanf тут нельзя применить, заранеене выделив память, getchar пишет сразу в переменную, а не в буфер, так? Есть ли просто функция по открытию консоли и записи в буфер?

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

Добавлено: 2008-12-27 14:18:42
paradox
А я вот слышал, что всё, что я ввёл с клавиатуры записывается в буфер. Нельзя ли после нажатия enter прочесть буфер, и зная количесво символов выделить память и записать символы в эту память?
пишете свою обертку на функцию
в которой выделяете буффер заранее большего размера
и перед выходом их функции сканируете размер и возращаете его

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

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

Добавлено: 2008-12-27 14:24:30
Antolflash
Так этот буфер уже написан и выделен, он уже используется, это буфер ввода. Вот как с него считать? Scanf и getchar выталкивают буфер, а есть ли фугкция, которая просто открывает консоль и пишет в буфер?

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

Добавлено: 2008-12-27 14:30:03
paradox
мы друг друга непонимаем

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

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

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

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

Добавлено: 2008-12-27 15:00:35
paradox
вы пытаетесь понять как устроена ОС ?
или пытаетесь соптимизировать 10 строк вашей программы?

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

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

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

Добавлено: 2008-12-27 16:00:06
paradox

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

Добавлено: 2008-12-27 21:53:47
Antolflash
Вы мой вопрос не поняли, переформулирую. Как пересчитать все сиволы (их кол-во), которые лежат в буфере сразу после нажатия enter, но никуда их не записывать?

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

Добавлено: 2008-12-27 22:02:54
paradox
никак

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

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

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

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

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

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

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

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

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

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

Добавлено: 2008-12-28 1:15:27
Antolflash
Console Functions
Тут вроде есть простое открытие консоли для записи вникуда и операции анализа буфера ввода. Вот то, что требовалось сказать, нашёл это в msdn, нужную ссылку на другом форуме дали. Причём вопрос я сформулировал как надо, просто вы не захотели слушать вопрос.

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

Добавлено: 2008-12-28 1:43:22
paradox
это типа все должны были догадаться что вы про виндовс говорите ?

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

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

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

Добавлено: 2008-12-31 15:46:58
Aesthete Animus
Вообще говоря, все гораздо проще, ибо есть уже открытые дескрипторы fileno(stdin)/fileno(stdout) (которые по посиксу равны 0 и 1 соответственно), которые доступны для записи/чтения стандартными read/write. Но афтору категормчкский низачот, ибо не зная ни язык, ни основ ввода вывода, хочет, что бы угадывали его гениальные мысли насчет оптимизации.