Comment utiliser un QFile avec std::iostream?
Est-il possible d'utiliser un QFile comme un std::iostream? Je suis assez sûr qu'il y a un wrapper. La question est où?
J'ai une autre libs, ce qui nécessite un std::istream comme paramètre d'entrée, mais dans mon programme, je n'ai qu'un QFile à ce point.
That ressemble à une solution, mais il nécessite un coup de pouce.
Pourriez-vous accepter la non solution portable et si oui quelle plate-forme vous avez besoin de ce travail?
Est boost::iostream interchangeables avec std::basic_stream?
Pourriez-vous accepter la non solution portable et si oui quelle plate-forme vous avez besoin de ce travail?
Est boost::iostream interchangeables avec std::basic_stream?
OriginalL'auteur Andreas Roth | 2011-03-05
Vous devez vous connecter pour publier un commentaire.
Je suis venu avec ma propre solution (qui utilise la même idée Stephen Chu suggéré)
De sortie:
Ce code utilise des std::ifstream constructeur de déplacement (C++x0) spécifié dans 27.9.1.7 basic_ifstream constructeurs section de Projet de Travail, Standard pour la Programmation en Langage C++:
Voir Comment retourner un fstream (C++0x) pour la discussion sur ce sujet.
ifstream(::_fdopen(file.handle(), "r"));
j'obtiens:error: no matching function for call to 'std::basic_ifstream<char>::basic_ifstream(FILE*)' std::ifstream fileInputStream(::_fdopen(testPatternPng.handle(), "r"));
OriginalL'auteur Piotr Dobrogost
Je suis venu avec ma propre solution en utilisant le code suivant:
Je fonctionne très bien pour la lecture des fichiers locaux. Je n'ai pas testé pour l'écriture de fichiers. Ce code est sûrement pas parfait, mais il fonctionne.
OriginalL'auteur Andreas Roth
Si l'objet QFile vous obtenez n'est pas ouvert pour le lire déjà, vous pouvez obtenir le nom de fichier et ouvrir un ifstream objet.
S'il est déjà ouvert, vous pouvez obtenir le fichier de la poignée/du descripteur avec
handle()
et aller de là. Il n'y a pas de portable d'obtenir un fstream de la plate-forme de la poignée. Vous aurez à trouver une solution de contournement pour vos plates-formes.En fait, vous pouvez utiliser Boost.IOStreams pour la plate-forme indépendante de la création d'un iostream de fd: tout d'Abord vous créer un flux de données de la mémoire tampon:
boost::iostreams::stream_buffer<boost::iostreams::file_descriptor> streambuf(handle)
, puis passez le pointeur de la mémoire tampon de votre nouveaustd::iostream(&streambuf)
.OriginalL'auteur Stephen Chu
Voici un bon guide pour la sous-classement std::streambuf de fournir un non-adressable en lecture seule std::istream: https://stackoverflow.com/a/14086442/316578
Ici est une simple classe basée sur cette approche qui s'adapte à un QFile dans un std::streambuf qui peut ensuite être enveloppé dans un std::istream.
Si vous voulez être capable de plus de choses comme les chercher, écrire, etc., puis vous auriez besoin l'un de l'autre des solutions plus complexes ici, qui l'emportent de plus streambuf fonctions.
OriginalL'auteur Anthony Hayward
Si vous n'avez pas beaucoup de soins pour les performances, vous pouvez toujours lire tout le contenu du fichier et la déverser dans un
std::stringstream
et de passer ensuite que votre bibliothèque. (ou dans le cas contraire, des tampons, le tout à un stringstream et puis écrire un QFile)Autre que cela, il n'a pas l'air comme les deux peuvent inter-opérer. En tout cas, Qt au format STL entre les opérations sont souvent une cause de bogues obscures et subtile des incohérences si la version de STL Qt a été compilé avec est différente de la version de la STL que vous utilisez. Cela peut arriver par exemple si vous changez la version de Visual Studio.
OriginalL'auteur shoosh