Question

Pour certaines raisons, j'ai besoin d'un pointeur de fichiers (fichier *) qui ne pointe rien. Cela signifie que je peux le transmettre à la fonction fprintf et fprintf ignorer le pointeur de fichier.

par exemple:

void my_function()
{
  FILE* nothing = NULL; // NULL is not correct.
  int n = fprintf(nothing, "PI = %f", 3.14); // Note: When nothing = NULL, error ocured.
}

Existe-t-il un pointeur de fichiers (fichier *) qui ne pointe rien?

Était-ce utile?

La solution

Non.

Votre code entraînera une exception d'exécution. Vous pouvez utiliser /dev/null Par exemple, si vous utilisez un système d'exploitation qui le prend en charge, mais il n'y a rien de tel que celui intégré en C ++.

Autres conseils

Pour résoudre votre problème réel (énoncé dans les commentaires), utilisez snprintf à la place de printf, à condition qu'il soit disponible dans votre implémentation C ++ (qui n'est pas garantie dans C ++ 03). Passez un pointeur nul pour le tampon et 0 pour la taille. Rien n'est écrit, mais la valeur de retour est la longueur de la chaîne formatée (à l'exclusion du terminateur NUL).

Modifier: oups, j'ai oublié ça snprintf sur Windows ne se conforme pas à C99. Il renvoie une erreur en cas de troncature, pas la longueur requise. Je ne sais pas ce qu'ils vont faire pour le fait que C ++ 0x nécessite la conformité C99 snprintf.]

Pour répondre à votre question, vous pouvez fopen /dev/null sur les systèmes de type Unix ou nul sur Windows. Écrit à la résultante FILE* n'ont aucun effet. Cependant, il n'y a pas de périphérique nul portable.

Pourquoi ne pas envelopper l'appel de la méthode fprintf avec un if (NULL != nothing) déclaration?

Bien que comme Nirmh l'a dit, vous pouvez l'enfermer dans if (nothing != NULL), il y a une autre façon. Vous pouvez ouvrir un fichier en mode lecture (avec "r") Et quand vous l'envoyez à fprintf, l'écriture est ignorée (modifier: comme discuté dans les commentaires, n'oubliez pas de définir n=0 Si c'était négatif comme retourné par fprintf).

Je suggère personnellement la première méthode. La seule raison pour laquelle je pourrais faire la seconde est si je ne peux pas modifier la fonction.

Si vous ne vous souciez pas si votre code dépend du système, vous pouvez utiliser /dev/null Dans Linux, nul Dans Windows, etc.,

Vous faites une erreur de conception.

De toute évidence, ce que vous voulez savoir, c'est le nombre de caractères nécessaires pour écrire votre numéro.

Vous utilisez _ * printf_ pour cela, ce qui est une bonne idée. Vous voulez juste calculer le nombre de caractères "écrits", donc nécessaires. Mais tu ne veux rien être affiché, alors tu as piqué fprintf au lieu de juste printf. Mais fprintf Ne fonctionne pas sans fichier à écrire ...

Comme Steve l'a dit, vous devriez plutôt utiliser snprintf (), qui écrit en une chaîne en mémoire.

Comme le dit Steve, snprintf fourni avec une chaîne nulle devrait fonctionner comme prévu, sauf sur Windows. Ensuite, sur Windows, fournissez-le simplement avec une chaîne temporaire que vous jeterez par la suite.

size_t computeNumCharsNeededToPrintMyStuff(double d)
{
    size_t ret = 0;
    size_t maxBuffSize = 100; // should be plenty enough

    char *tmpBuff = new char[maxBuffSize ];
    ret = snprintf(tmpBuff, maxBuffSize, "PI = %f", d);
    delete[] tmpBuff;

    return ret;
}

Ensuite, vous appelez simplement:

n = computeNumCharsNeededToPrintMyStuff(3.14)

(Cette func pourrait être améliorée pour calculer la taille nécessaire pour afficher quoi que ce soit, mais je préfère rester simple pour l'instant.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top