C ++ эквивалент .net Stream? - PullRequest
       10

C ++ эквивалент .net Stream?

1 голос
/ 28 января 2010

Каков базовый класс всех потоков в C ++?

Кроме того, что эквивалентно MemoryStream в C ++?

Ответы [ 4 ]

7 голосов
/ 28 января 2010

Существует несколько общих базовых классов для потоков: std::ios::ios_base является окончательным суперклассом, но есть также ios, istream, ostream и iostream для различных типов функциональности. istream& и ostream& - это то, что вы чаще всего используете в качестве полиморфных типов параметров.

Вот красивая картинка: http://www.cplusplus.com/reference/iostream/

Я не .Net человек, поэтому я не знаю, как обычно используется MemoryStream, но std::stringstream, вероятно, служит хотя бы некоторым из тех же целей. Если это не делает то, что вам нужно, я думаю, что вы остаетесь возиться с streambufs.

3 голосов
/ 28 января 2010

Если вам нужно решение на чистом C ++, ответ Стива - верное направление.

Если вы работаете в Windows и не возражаете против использования COM, то интерфейс IStream близко соответствует System.IO.Stream. CreateStreamOnHGlobal приведет к IStream, построенному на буфере памяти, очень похожем на MemoryStream.

0 голосов
/ 28 января 2010

Глядя на документацию System.IO.Stream по MSDN, кажется, что она ближе к потоковому буферу C ++, чем к потоку C ++.

В библиотеке C ++ IOStreams есть два уровня:

  • basic_streambuf - это нижний уровень, заботящийся о реальном вводе-выводе и имеющий дело только с последовательностями «символов». Существуют различные реализации, в зависимости от того, с чем сделан ввод / вывод. Например, base_filebuf выполняет чтение и запись в файлы, basic_stringbuf выполняет чтение и запись в строку в памяти.
  • поток (basic_istream для ввода, basic_ostream для вывода), который содержит basic_streambuf. Роль потока - это форматирование (т. Е. Преобразование между значениями других типов и последовательностью «символов», обрабатываемых streambuf). Он не выполняет сам фактический ввод-вывод; он передает его в streambuf. * ​​1008 *

Проблема в том, что потоки, в дополнение к их интерфейсу форматирования, также более или менее непосредственно предоставляют функциональность своего потокового буфера, поэтому поток может использоваться для выполнения неформатированного ввода-вывода. Например, для вывода у basic_ostream есть несколько операторов << для форматированного вывода, но также есть члены «положить» и «записать», позволяющие (более или менее) обходить поток и напрямую записывать в содержащий поток буфера. </p>

0 голосов
/ 28 января 2010

Один базовый класс - std::ios::ios_base, но все связанные с потоком классы являются шаблонами (что вызвало у меня много горя еще в 2001 году, когда я преобразовал какой-то действительно умный и стандартный код C ++). Это позволяет использовать потоки с char, wchar_t и любым другим типом, который кто-то хочет использовать в качестве символа. Не обязательно можно ссылаться на один базовый класс в C ++, так как язык имеет множественное наследование, и библиотека использует его, но похоже, что ios_base в этом случае соответствует требованиям, хотя обеспечивает функциональность формата, а не ввод / вывод.

Я не знаю, как потоки .NET работают на низкоуровневой основе, но потоки C ++ довольно сложны под поверхностью.

Если то, что вы ищете, это что-то вроде MemoryStream, мне кажется, что stringstream может заполнить счет или, возможно, не рекомендуется strstream (устарело, но все еще в последней версии C +) + 0x стандарта, который я видел), который IIRC позволяет вам присоединить поток к выбранной области памяти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...