Как читать стандартный буфер istream в c ++? - PullRequest
0 голосов
/ 13 января 2012

У меня следующая проблема. Я должен реализовать класс, который имеет атрибут, который является указателем на символ, предназначенный для указания на «код» объекта, следующим образом:

class foo{
     private:
         char* cod;
         ...
     public:
         foo();
         void getVal();
         ...
}

И так далее, и тому подобное. getVal () - это метод, который берет код из стандартного istream и заполняет всю информацию, включая код. Дело в том, что «код», который идентифицирует объект, не может быть длиннее определенного количества символов. Это должно быть сделано без использования пользовательских буферов для метода getVal (), поэтому я не могу сделать следующее:

//suppose the maximum number of characters is 50
void foo::getVal()
{
     char buffer[100];
     cin >> buffer;
     if (strlen(buffer) > 50) //I'm not sure this would work considering how the stream
                               of characters would be copied to buffer and how strlen
                               works, but suppose this tells me how long the stream of 
                               characters was.
     {
        throw "Exception";
     }
     ...
}

Это запрещено. Я также не могу использовать настроенный istream или библиотеку надстроек.

Я думал, что смогу найти место, где istream хранит информацию довольно легко, но я не могу ее найти. Все, что я нашел, было упоминание о других типах потока.

Может кто-нибудь сказать мне, если это можно сделать или где поток хранит свою буферизованную информацию?

Спасибо

Ответы [ 3 ]

0 голосов
/ 14 января 2012

да, использование strlen определенно будет работать .. вы можете написать пример программы

   int main()
   {

    char buffer[10];
    std::cout << "enter buffer:" ;
    std::cin >>buffer;
    if(strlen(buffer)>6)
    std::cout << "size > 6";
    getch();
   }

для входных данных размером более 6 символов будет отображаться размер> 6

0 голосов
/ 14 января 2012

хм .... >> читает до первого пробела, в то время как strlen считает до первого нуля. Они могут быть смешаны, если вы точно знаете, что в середине строки, которую вы собираетесь читать, нет пробелов и что не более 100 последовательных символов. Если нет, вы переполните буфер перед броском.

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

Если пробелы являются разделителями, почему бы просто не прочитать std::string и не отреагировать на его окончательное состояние? Вся вышеуказанная динамика уже обработана внутри >> для std :: string.

[РЕДАКТИРОВАТЬ после комментариев ниже]

Единственный способ сохранить последовательность неизвестного размера - это динамически распределять пространство и увеличивать его по мере необходимости. Это не больше, не меньше того, что делают жало и вектор.

Независимо от того, используете ли вы их или пишете свой собственный код для выделения и перераспределения там, где требуется больше места, это не меняет сути.

Я начинаю думать, что единственная причина этих требований - увидеть ваши возможности в написании собственного строкового класса. Итак ... просто напишите это:

объявляет класс, содержащий указатель размера и емкости, выделяет некоторое пространство, отслеживает, сколько вы храните, и, когда хранилище недоступно, выделяет другое более широкое хранилище, копирует старое, уничтожает его и соответственно корректирует элемент данных .

Непосредственный доступ к буферу файлов невозможен, поскольку вы не контролируете, как заполняется буфер файлов.

0 голосов
/ 13 января 2012

istream использует streambuf.

Я считаю, что www.cplusplus.com - довольно хорошее место для быстрой ссылки на C ++. Вы можете пойти туда, чтобы узнать, как использовать streambuf или его производную filebuf.

...