Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> iostream и поток данных, как это работает 
:(
    Опции темы
ilyagoo
  Дата 3.8.2010, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



собственно, сабж:

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

заранее спаибо за помощь!
PM MAIL   Вверх
mrbrooks
Дата 3.8.2010, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



PM MAIL   Вверх
ilyagoo
Дата 3.8.2010, 15:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(mrbrooks @ 3.8.2010,  15:04)
тыц

читал. но вот пример бы... без него как-то не въехать(((
iostream абстрактный?
PM MAIL   Вверх
mrbrooks
Дата 3.8.2010, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



Цитата(ilyagoo @  3.8.2010,  16:10 Найти цитируемый пост)
читал. но вот пример бы... без него как-то не въехать(((

в приведенной ссылке пощелкайте по сноскам. ко всем методам там есть примеры - что, как и с кем.


Цитата(ilyagoo @  3.8.2010,  16:10 Найти цитируемый пост)
iostream абстрактный? 

хм. даже не знаю что и ответить  smile 
PM MAIL   Вверх
ilyagoo
Дата 3.8.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(mrbrooks @  3.8.2010,  15:21 Найти цитируемый пост)
даже не знаю что и ответить

наверное. не так выразился, например:
ios_base is not designed to be directly instantiated into objects

Это сообщение отредактировал(а) ilyagoo - 3.8.2010, 15:29
PM MAIL   Вверх
mrbrooks
Дата 3.8.2010, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


трололомен
****


Профиль
Группа: Завсегдатай
Сообщений: 4259
Регистрация: 4.10.2006
Где: Дол Гулдур

Репутация: 19
Всего: 306



PM MAIL   Вверх
ilyagoo
Дата 3.8.2010, 15:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



ага. стало быть, конструктор принимает указатель на streambuf, который в свою очередь является объектом, контролирующим буфер. в моем случае - это char[]. Virtual protected member functions подсказываем мне, что функции можно реализовать в наследниках. а вот нужно ли? есть ли реализация по умолчанию и будет ли она сама следить за этим char[]?
PM MAIL   Вверх
bsa
Дата 3.8.2010, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



ilyagoo, стандартная реализация есть - stringbuf. Вот только она расширяет буфер до тех пор, пока память не кончится. Если тебе нужна не такая реализация, то придется писать свой наследник streambuf. Тут можешь посмотреть, сколько виртуальных методов тебе придется переписать.
PM   Вверх
ilyagoo
Дата 4.8.2010, 09:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата

стандартная реализация есть - stringbuf.

тогда еще вопрос. куда копируются данные?
Код

#include <iostream>
#include <sstream>

int main()
{
    char output[] = "==========";
    char input[] = "12345";

    std::stringstream stream;
    std::stringbuf *streambuf = stream.rdbuf();
    
    int avail = 0;

    avail = streambuf->in_avail();
    std::cout << "avail = " << avail << std::endl;

    stream.write( input, 5 );
    avail = streambuf->in_avail();
    std::cout << "avail = " << avail << std::endl;

    stream.read( output, 1 );
    avail = streambuf->in_avail();
    std::cout << "avail = " << avail << std::endl;

    stream.read( output, 1 );
    avail = streambuf->in_avail();
    std::cout << "avail = " << avail << std::endl;

    return 0;
}


вывод:
Код

avail = 0
avail = 1
avail = 0
avail = 3
  •  вывод очевиден
  •  почему 1, ведь вбил 5?
  •  прочел 1, должно было остаться 4...
  •  ну, хоть что-то...

где в каждый момент времени должны находиться мои данные?
PM MAIL   Вверх
azesmcar
Дата 4.8.2010, 09:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



не легче написать свой оператор добавления в поток, который будет проверять перед добавлением и в случае чего бросать исключение?
PM   Вверх
ilyagoo
Дата 4.8.2010, 09:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



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

не легче ли написать свой поток? 
как все-таки работает стандартная библиотека?
PM MAIL   Вверх
azesmcar
Дата 4.8.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 52
Всего: 211



Цитата(ilyagoo @  4.8.2010,  09:47 Найти цитируемый пост)
не легче ли написать свой поток? 

т.е. наследовать свой класс и переписывать виртуальные функции легче чем написать простой оператор << для своего типа?
PM   Вверх
toxx
Дата 4.8.2010, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 653
Регистрация: 4.3.2009
Где: НН

Репутация: 4
Всего: 13



Цитата

avail = 0
avail = 1
avail = 0
avail = 3

странно, но выводит чтото другое...
PM MAIL   Вверх
ilyagoo
Дата 4.8.2010, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 2.5.2010
Где: Санкт-Петербург

Репутация: нет
Всего: нет



Цитата(toxx @ 4.8.2010,  09:50)
Цитата

avail = 0
avail = 1
avail = 0
avail = 3

странно, но выводит чтото другое...

спасибоsmile
собрал в линухе - все ok.

то был результат реализации стандарта от M$

придется самому изобретать велосипед...
PM MAIL   Вверх
boostcoder
Дата 4.8.2010, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 20
Всего: 110



у меня результат такой:
Цитата

avail = 0
avail = 1
avail = 4
avail = 3

код тут: http://liveworkspace.org/code/dcde4129fd8b...64674d60fcaf01e
PM WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.