Domanda

Per alcuni dei motivi per cui ho bisogno di un puntatore del file (file *) che non punta a nulla.Significa che posso passarlo alla funzione FPRINTF e FRINTRF Ignora il puntatore del file.

Ad esempio:

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

C'è un puntatore di file (file *) che punta a nulla?

È stato utile?

Soluzione

No.

Il codice causerà un'eccezione in fase di esecuzione.Ad esempio, puoi utilizzare /dev/null se stai utilizzando un sistema operativo che lo supporta, ma non c'è niente di simile integrato in C ++.

Altri suggerimenti

Per risolvere il tuo problema effettivo (indicato nei commenti), utilizzare snprintf anziché printf, a condizione che sia disponibile nella tua implementazione C ++ (che non è garantita in C ++ 03).Passare in un puntatore null per il buffer e 0 per le dimensioni.Niente è scritto, ma il valore di ritorno è la lunghezza della stringa formattata (esclusa il terminatore NUL).

[Modifica: Oops, ho dimenticato che snprintf su Windows non è conforme a C99.Restituisce un errore se si verifica il troncamento, non la lunghezza richiesta.Non so cosa faremo del fatto che C ++ 0x richiede snprintfGcode di conformità C99.]

Per rispondere alla tua domanda, puoi fopen /dev/null su sistemi simili a Unix o nul su Windows.Scrives al FILE* risultante non ha alcun effetto.Tuttavia, non esiste alcun dispositivo NULL portatile.

perché non racchiudere la chiamata al metodo fprintf con un'istruzione if (NULL != nothing)?

Anche se, come ha detto NirMH, puoi racchiuderlo in if (nothing != NULL), c'è un altro modo.Puoi aprire un file in modalità di lettura (con "r") e quando lo invii a fprintf, la scrittura viene ignorata (Modifica: come discusso nei commenti, ricordati di impostare n=0 se era negativo come restituito da fprintf).

Tuttavia, personalmente suggerisco il primo metodo.L'unico motivo per cui potrei fare il secondo è se non riesco a cambiare la funzione.

Se non ti interessa se il tuo codice dipende dal sistema, puoi usare /dev/null in linux, nul in windows ecc.

stai facendo un errore di progettazione.

Ovviamente, quello che vuoi sapere è il numero di caratteri necessari per scrivere il tuo numero.

stai usando _ * printf_ per questo, che è una buona idea. Vuoi solo calcolare il numero di caratteri "scritti", quindi necessario. Ma non vuoi che non venga visualizzato nulla, quindi hai punture fprintf invece di solo printf . Ma FPRINTF non funziona senza un file da scrivere in ...

Come Steve ha detto, dovresti piuttosto usare snprintf () , che scrive in una stringa in memoria.

Come dice Steve, snprintf fornito con una stringa nullo dovrebbe funzionare come previsto tranne che su Windows. Poi su Windows, solo fornirla con una stringa temporanea che scartarai in seguito.

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;
}
.

Quindi chiami:

n = computeNumCharsNeededToPrintMyStuff(3.14)
.

(Questo func potrebbe essere migliorato per calcolare le dimensioni necessarie per visualizzare qualsiasi cosa, ma preferirei tenerlo semplice per ora.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top