Comment implémenter la classe ostream
-like à partir de rien en utilisant printf
seulement?
Pour me semble que le problème est dans le choix de la chaîne de format, qui est en fait égal à l'identification de type input`s et le traitement de précisionostream implementatuon using printf
Répondre
Je suppose que vous voulez dire quelque chose qui surchargent operator<<
par « une classe ostream
-comme ». Il est facile d'identifier le type de l'argument d'une fonction simplement en ayant des surcharges. Par exemple, vous pouvez avoir:
ostreamlike& ostreamlike::operator<<(int x)
{
printf("%d", x);
return *this;
}
ostreamlike& ostreamlike::operator<<(float x)
{
printf("%f", x);
return *this;
}
Le format de la sortie est déterminé par la surcharge sélectionnée.
Cela dépend de la proximité du vrai ostream
que vous voulez être. En supposant que vous voulez le faire correctement, vous aurez également besoin d'une classe dérivée streambuf
. ostream
ne fait que le formatage, les E/S réelles sont effectuées par une classe dérivée interne streambuf
. Étant donné que streambuf
effectue des E/S non formatées, vous devez utiliser fwrite
et non printf
.
Si votre but est simplement de faire des E/S sur un pointeur FILE*
déjà existant, c'est le chemin à parcourir. Vous dérivez une classe de streambuf
, dites streambuf_with_FILE
puis vous dérivez une autre classe de ostream
dites ostream_with_FILE
. streambuf_with_FILE
remplace les méthodes appropriées pour effectuer les E/S réelles et ostream_with_FILE
possède un objet interne streambuf_with_FILE
. Il y a en fait très peu de code requis.
penser, il pourrait être quelque chose comme ça
#include <stdio.h>
class ostreamlike {
public:
ostreamlike(FILE* f_): f(f_) {}
ostreamlike& write(int n) {
fprintf(f, "%d", n);
return *this;
}
ostreamlike& write(const char* n) {
fprintf(f, "%s", n);
return *this;
}
private:
FILE* f;
};
// operator for types that is supported ostreamlike internally
template <typename type>
ostreamlike& operator<<(ostreamlike& stream, const type& data) {
return stream.write(data);
}
// external implementations to write using ostreamlike
ostreamlike& operator<<(ostreamlike& stream, bool data) {
return stream.write(data ? "true" : "false");
}
int main() {
ostreamlike s(stdout);
s << "hello " << 1 << " : " << true << "\n";
return 0;
}
- 1. Comment utiliser C++ std :: ostream avec un format de type printf?
- 2. Surcharger ostream
- 3. ostream surcharge
- 4. ostream utilisation iterator en C++
- 5. C++ numéro opérateur ostream
- 6. Surcharge de l'opérateur: Ostream/Istream
- 7. Comment implémenter 'virtual ostream & print (ostream & out) const;'
- 8. Printf ("ABCD"); printf ("ABCD" +1);
- 9. Problèmes avec ostream
- 10. Un ostream personnalisé
- 11. inherit std :: ostream
- 12. erreur avec définition ostream
- 13. Fonction retour à ostream
- 14. Réinitialisation d'un ostream, C++
- 15. Écriture d'un filtre ostream?
- 16. Ostream personnalisé sans rinçage?
- 17. opérateur ostream surcharge - héritage
- 18. Invoquer opérateur ostream spécialisé
- 19. Surcharge ambiguë de std :: ostream & opérateur << (std :: ostream & sstr, const T & val)
- 20. printf caractères UTF8 avec printf ints hexadécimaux
- 21. simple C++ classe d'enregistrement - initialisation de référence ostream
- 22. C++ ostream et ofstream conversions
- 23. Surcharge << opérateur ostream
- 24. Ostream << surcharge confusion
- 25. comment manipuler le contenu ostream
- 26. ABC Virtual ostream Insertion opérateur
- 27. C++ ostream Héritage et Manipulateurs
- 28. Problème avec l'héritage ostream/ofstream
- 29. ostream & ... quel est le '&' ici?
- 30. utilisant l'itérateur dans ostream échoue