Créer un flux sur une / à partir d'une chaîne de caractères

Il arrive que l'on souhaite créer un flux à partir d'une chaîne de caractères, par exemple pour faciliter certaines opérations de traduction entre texte et nombres (ou entre texte et autres types sérialisables). En langage C, les fonctions sscanf() et sprintf() sont les outils privilégiés en ce sens, mais la majorité des langages ont des métaphores à proposer pour y arriver.

En C++

En C++, le type à privilégier pour ce faire est un std::stringstream (incluez <sstream>).

La fonction make_stream proposée à droite crée un tel flux. Elle instancie un stringstream sur la base du texte src et retourne ce flux.

Il sera possible par la suite d'extraire de ce flux ce dont on a besoin.

auto make_stream(const string &src) {
   return stringstream{ src };
}
int main() {
   auto strm = make_stream("1\n2\n3");
   for(int n; strm >> n; )
      cout << n << endl;
}

En C#

En C#, le type à privilégier pour ce faire est MemoryStream, qui dérive de la classe abstraite Stream (assurez-vous d'avoir recours à using System.IO)

La fonction MakeStream proposée à droite crée un tel flux.

Elle instancie un MemoryStream vide, puis un StreamWriter pour y écrire; par la suite, elle écrit la totalité de la chaîne src sur ce flux, s'assure que l'écriture soit bel et bien complétée, puis replace la position de consommation sur ce flux au début du flux avant de retourner une référence sur le MemoryStream.

Il sera possible par la suite de créer un StreamReader ou une autre sorte de consommateur de flux, et d'extraire de ce flux ce dont on a besoin.

static Stream MakeStream(string src)
{
   var stream = new MemoryStream();
   var writer = new StreamWriter(stream);
   writer.Write(src);
   writer.Flush();
   stream.Position = 0;
   return stream;
}
public static void Main()
{
   using(var reader = new StreamReader(MakeStream("1\n2\n3")))
   {
      for(string s = reader.ReadLine(); s != null; s = reader.ReadLine())
         if (int.TryParse(s, out int n))
            Console.WriteLine(n);
   }
}

En Java

À venir (il y a assurément un mécanisme, mais je n'ai pas eu le temps de fouiller encore).

Lectures complémentaires

Quelques liens pour enrichir le propos (à venir).


Valid XHTML 1.0 Transitional

CSS Valide !