2010-01-28 5 views

Répondre

7

Il existe plusieurs classes de base communs pour les flux: std::ios::ios_base est la superclasse ultime, mais il y a aussi ios, istream, ostream et iostream pour différents types de fonctionnalité. istream& et ostream& sont ce que vous voyez le plus souvent utilisé comme types de paramètres polymorphes.

Voici une jolie photo: http://www.cplusplus.com/reference/iostream/

Je ne suis pas une personne .Net, donc je ne sais pas comment MemoryStream est généralement utilisé, mais std::stringstream sert probablement au moins quelques-uns des mêmes fins. Si ça ne fait pas ce dont tu as besoin, je pense que tu te retrouves avec des streambufs.

3

Si vous voulez une solution C++ pure, la réponse de Steve est la bonne direction.

Si vous utilisez Windows et que cela ne vous dérange pas d'utiliser COM, l'interface IStream est proche de System.IO.Stream. CreateStreamOnHGlobal résultera en un IStream construit sur un tampon de mémoire semblable à MemoryStream.

0

Une classe de base est std::ios::ios_base, mais toutes les classes liées au flux sont des modèles (ce qui m'a causé beaucoup de chagrin en 2001, en convertissant un code C++ pré-standard très intelligent). Cela permet aux flux d'être utilisés avec char, wchar_t, et tout autre type que quelqu'un veut utiliser comme caractère. Il n'est pas forcément possible de se référer à une seule classe de base en C++, puisque le langage a plusieurs héritages et que la bibliothèque l'utilise, mais il semble que ios_base se qualifie dans ce cas, bien qu'il fournisse des fonctionnalités de format et non d'E/S.

Je ne sais pas comment les flux .NET fonctionnent à un niveau bas, mais les flux C++ sont assez compliqués sous la surface.

Si ce que vous cherchez est quelque chose comme MemoryStream, il me semble que stringstream pourrait remplir le projet de loi, ou peut-être le strstream dépréciée (désapprouvée, mais toujours dans le dernier projet de la norme C++ 0x Je vu), que IIRC vous permet d'attacher un flux à une zone de mémoire sélectionnée.

0

En regardant la documentation de System.IO.Stream sur MSDN, il semble être plus proche d'un streambuf C++ que d'un flux C++.

Dans la bibliothèque iostream C++, il y a deux couches:

  • la basic_streambuf est la couche inférieure, en prenant soin de l'E/S réelle et traitant uniquement avec des séquences de « caractères ». Il existe différentes implémentations, en fonction de ce que l'E/S est faite avec. Par exemple, base_filebuf lit et écrit dans des fichiers, basic_stringbuf lit et écrit dans une chaîne en mémoire.
  • le flux (basic_istream pour l'entrée, basic_ostream pour la sortie), qui contient un basic_streambuf. Le rôle du flux est le formatage (c'est-à-dire, la transformation entre les valeurs d'autres types et la séquence de "caractères" manipulés par le streambuf). Il ne fait pas les E/S elles-mêmes; il le délègue au streambuf.

Ce qui brouille la question est que les cours d'eau, en plus de leur interface de mise en forme, exposent également plus ou moins directement la fonctionnalité de leur streambuf, donc un flux peut être utilisé pour faire E/S non formaté. Pour la sortie, par exemple, basic_ostream a un numéro d'opérateur < < pour la sortie formatée, mais il a aussi les membres "put" et "write" permettant (plus ou moins) de contourner le flux et d'écrire directement dans le streambuf contenu.