Frage

Aus bestimmten Gründen benötige ich einen Dateizeiger (FILE*), der auf nichts zeigt.Das bedeutet, dass ich es an die Funktion fprintf übergeben kann und fprintf den Dateizeiger ignoriert.

Zum Beispiel:

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

Gibt es einen Dateizeiger (FILE*), der auf nichts zeigt?

War es hilfreich?

Lösung

nein.

Ihr Code verursacht eine Laufzeitausnahme.Sie können beispielsweise generasAdicetagcode verwenden, wenn Sie auf einem Betriebssystem ausgeführt werden, das es unterstützt, aber in C ++ ist nichts installiert.

Andere Tipps

Um Ihr eigentliches Problem (in den Kommentaren angegeben) zu lösen, verwenden Sie snprintf anstatt printf, vorausgesetzt, dass es in Ihrer C++-Implementierung verfügbar ist (was in C++03 nicht garantiert ist).Übergeben Sie einen Nullzeiger für den Puffer und 0 für die Größe.Es wird nichts geschrieben, aber der Rückgabewert ist die Länge der formatierten Zeichenfolge (ohne Null-Terminator).

[Bearbeiten:Ups, das habe ich vergessen snprintf unter Windows entspricht nicht C99.Es wird ein Fehler zurückgegeben, wenn eine Kürzung auftritt, nicht die erforderliche Länge.Ich weiß nicht, was sie angesichts der Tatsache tun werden, dass C++0x C99-Konformität erfordert snprintf.]

Um Ihre Frage zu beantworten, können Sie fopen /dev/null auf UNIX-ähnlichen Systemen oder nul unter Windows.Schreibt in das Ergebnis FILE* keine Wirkung haben.Es gibt jedoch kein tragbares Null-Gerät.

Whiting der FPRINTF-Methode-Anrufe mit einer if (NULL != nothing)-Anweisung nicht umwickeln?

Obwohl, wie NirMH sagte, Sie es einschließen können if (nothing != NULL), es geht auch anders.Sie können eine Datei im Lesemodus öffnen (mit "r") und wenn Sie es an senden fprintf, der Schreibvorgang wird ignoriert (Bearbeiten:Wie in den Kommentaren besprochen, denken Sie daran, es festzulegen n=0 wenn es negativ war, wie von zurückgegeben fprintf).

Ich persönlich empfehle jedoch die erste Methode.Der einzige Grund, warum ich das Zweite tun könnte, ist, wenn ich die Funktion nicht ändern kann.

Wenn es Ihnen egal ist, ob Ihr Code systemabhängig ist, können Sie ihn verwenden /dev/null unter Linux, nul in Fenstern usw.

Sie machen einen Designfehler.

Natürlich möchten Sie die Anzahl der Zeichen wissen, die zum Schreiben Ihrer Nummer erforderlich sind.

Sie verwenden dafür _ * printf_, was eine gute Idee ist. Sie möchten nur die Anzahl der "geschriebenen" Zeichen berechnen, die daher benötigt werden. Sie möchten jedoch nicht, dass etwas angezeigt wird, also haben Sie fprintf anstatt nur printf gestochen. Aber fprintf funktioniert nicht ohne eine DATEI zum Schreiben ...

Wie Steve sagte, sollten Sie lieber snprintf () verwenden. die in eine Zeichenfolge im Speicher schreibt.

Wie Steve sagt, sollte snprintf , das mit einer NULL-Zeichenfolge versehen ist, wie beabsichtigt funktionieren, außer unter Windows. Geben Sie unter Windows einfach eine temporäre Zeichenfolge ein, die Sie anschließend verwerfen.

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

Dann rufen Sie einfach an:

n = computeNumCharsNeededToPrintMyStuff(3.14)

(Diese Funktion könnte erweitert werden, um die Größe zu berechnen, die für die Anzeige von Objekten erforderlich ist, aber ich möchte sie vorerst lieber einfach halten.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top