2010-06-05 3 views
0

Je suis habitué aux commandes de paramètres PHP fwrite/fread, et je veux les rendre identiques en C++ aussi. Je veux que cela fonctionne avec les types de caractères et de chaînes de caractères, ainsi qu'avec tous les types de données que je mets dedans (seulement si la longueur est définie).surcharge de la fonction C++, rendant fwrite/fread agir comme les versions de PHP

Je suis Noob totale sur C++, c'est ce que je l'ai fait jusqu'à présent: Edit: fixe la std :: string & buf

size_t fwrite(FILE *fp, const std::string &buf, const size_t len = SIZE_MAX){ 
    if(len == SIZE_MAX){ 
     return fwrite(buf.c_str(), 1, buf.length(), fp); 
    }else{ 
     return fwrite(buf.c_str(), 1, len, fp); 
    } 
} 

size_t fwrite(FILE *fp, const void *buf, const size_t len = SIZE_MAX){ 
    if(len == SIZE_MAX){ 
     return fwrite((const char *)buf, 1, strlen((const char *)buf), fp); 
    }else{ 
     return fwrite(buf, 1, len, fp); 
    } 
} 

Si ce travail très bien? Et comment cela devrait-il être fait si je voulais le faire de la meilleure façon possible?

+1

La meilleure façon possible est d'utiliser C++ au lieu d'essayer de recréer php. Redéfinir les fonctions standard pour prendre des arguments différents est une recette pour les bugs et la confusion. –

Répondre

2

Si vous souhaitez écrire dans un fichier de la meilleure façon possible, vous devez utiliser std :: iostreams. Traiter manuellement la longueur du tampon est une recette pour les problèmes.

En outre, la surcharge supérieure doit prendre une const std :: string &, pas const std :: string.

Cependant, je ne vois pas de bugs réels.

+0

pourriez-vous expliquer quels inconvénients/problèmes il provoque quand je n'utilise pas le "std :: string & buf"? semble fonctionner sans elle aussi. – Newbie

+1

Si vous manquez le & vous faites une copie de l'objet à faire qui peut être coûteux en termes de CPU et de mémoire. –

+0

ah, pensait à ce sujet, merci! – Newbie

1

fwrite/fread ne fonctionne pas très bien avec les objets; alors que @DeadMG dit que vous seriez meilleur avec les flux.

quelque chose comme:

cout << str << endl; 

C'est une façon beaucoup plus orientée objet de faire les choses - vous pouvez surcharger les opérateurs dans les objets pour gérer les différentes exigences de chaque objet.

Ce n'est pas le bon type de surcharge des fonctions IMO. Si quelque chose, ces fonctions doivent être des méthodes dans l'objet.