utiliser istream pour lire à partir d’un tube nommé

Est-il possible de lire à partir du tube nommé (mkfifo) à l’aide de c ++ (stl) à l’aide d’un stream – ne définissant donc pas à l’avance char *buffer[MAX_SIZE] pour l’opération de lecture?

Je veux lire jusqu’à la fin du tampon et mettre le résultat dans std::ssortingng .

(Méthode actuelle: bytes = read(fd, buffer, sizeof(buffer)); nécessite l’atsortingbution préalable d’une sorte de tampon.)

Les pipes nommés créés avec mkfifo se comportent comme des fichiers normaux. Ainsi, ils peuvent être accédés en utilisant std::ifstream et std::ofstream :

 #include  #include  int main(int, char** argv) { std::ifstream file{argv[1]}; std::ssortingng line; std::getline(file, line); std::cout << line << '\n'; } 

Courir:

 mkfifo foobar ./main foobar 

Et ailleurs:

 echo 'Hello world!' > foobar 

… Cela entraînera ./main à imprimer «Hello world!» ./main la sortie standard.

Il n’ya rien de magique dans la tuyauterie vers votre programme, il tourne simplement votre lecture cin partir du stream au lieu de l’entrée de l’utilisateur de la console: terminal terminal Linux vers mon programme C ++

Un simple coup d’œil sur l’historique des modifications de cette question montrera que cette question s’est considérablement améliorée par rapport à sa version d’origine, grâce à Konrad Rudolph (l’autre interlocuteur de cette question.) Dans un souci de perversité, je vais gratter 2 de ses solutions pour slurping un stream en ssortingng :

Méthode istreambuf_iterator :

 const ssortingng mkfifo{ istreambuf_iterator(cin), istreambuf_iterator() }; 

ssortingngbuf copie ssortingngbuf :

 issortingngstream temp; temp << cin.rdbuf(); const auto mkfifo = temp.str(); 

Vous pouvez lire sur les avantages et les inconvénients de chacun sur leurs messages respectifs. Pour utiliser ce code, disons que votre programme compilé est nommé main vous le dirigeriez comme ceci:

 mkfifo named_pipe echo "lorem ipsum" > named_pipe ./main named_pipe