Vielleicht vermisse ich es nur, aber gibt es keine Funktion, die fprintf für Dateideskriptoren entspricht, oder sogar eine Möglichkeit, vorübergehend zwischen ihnen umzuschalten?
“fprintf”-ähnliche Funktion für Dateideskriptoren (dh int fd statt FILE* fp)
Werden
Eiskriminalität
Du könntest reinschauen dprintf
(GNU-Erweiterungen, nicht in C oder POSIX) :
Die Funktionen dprintf() und vdprintf() (wie sie in der glibc2-Bibliothek zu finden sind) sind exakte Entsprechungen von fprintf() und vfprintf(), außer dass sie an einen Dateideskriptor fd statt an einen gegebenen Stream ausgeben.
BEARBEITEN Wie einige von Ihnen in den Kommentaren darauf hingewiesen haben, hat POSIX 2008 diese Funktionen standardisiert.
-
Vielen Dank! Sehr interessant, hatte keine Ahnung, dass es die gibt.
– Prof. Falken
22. November 2010 um 15:01 Uhr
-
Ich auch nicht. Da diese App nur unter Linux läuft, könnte dies das sein, was ich brauche. Die plattformübergreifende Kompatibilität ist kein Problem, daher sollte die Verwendung der GNU-Erweiterung in Ordnung sein.
– Werden
22. November 2010 um 15:11 Uhr
-
Wenn die Portabilität keine Rolle spielt, entscheiden Sie sich für diese.
– Arkku
22. November 2010 um 15:20 Uhr
-
Tatsächlich hat POSIX 2008 diese Funktionen standardisiert.
– R.. GitHub HÖR AUF, EIS ZU HELFEN
22. November 2010 um 15:48 Uhr
Arkku
Es gibt keine Standardfunktion für C oder POSIX (Bearbeitung: vor 2008). printf
auf einem Dateideskriptor, aber Sie können einen Dateideskriptor als FILE *
mit dem POSIX-Standard fdopen(int desc, const char *mode)
. Ich bin mir nicht sicher, wie gut das Umschalten auf die direkte Verwendung des Deskriptors unterstützt wird, aber ich vermute, dass es funktionieren könnte, wenn Sie zuerst den Puffer leeren …
Natürlich könnten Sie einfach Ihre eigenen implementieren, indem Sie so etwas wie verwenden vsprintf
aber natürlich müssen Sie sich dann um die Pufferung kümmern.
-
Ich habe an fdopen gedacht, möchte aber wirklich kein anderes Handle “öffnen”, zumal IIRC, das fclose für dieses Handle aufruft, auch den zugrunde liegenden Dateideskriptor schließen wird. Das wäre ein Problem mit dem Code, an dem ich arbeite, da die Routine entweder einen Dateideskriptor oder ein Socket-Handle erhalten kann.
– Werden
22. November 2010 um 15:09 Uhr
-
@ Will: Du kannst
fdopen
eine Datei behandelt bekommen vondup
damit das Schließen Ihre ursprüngliche fd nicht beeinflusst– Hasturkun
22. November 2010 um 15:15 Uhr
-
@Hasturkun: Das stimmt, ich habe dup vergessen. Keine dieser Funktionen, die ich regelmäßig verwende.
– Werden
22. November 2010 um 15:23 Uhr
Für das, was es wert ist, da dprintf
keine POSIX-Funktion ist, könnte man Folgendes verwenden, wenn die Portabilität ein Problem darstellt:
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>
int
fdprintf ( int fd, size_t bufmax, const char * fmt, ... )
{
char * buffer;
int n;
va_list ap;
buffer = ( char * ) malloc ( bufmax );
if ( !buffer )
return 0;
va_start ( ap, fmt );
n = vsnprintf ( buffer, bufmax, fmt, ap );
va_end ( ap );
write ( fd, buffer, n );
free ( buffer );
return n;
}
Höchstwahrscheinlich möchten Sie den Rückgabewert von überprüfen write
, aber Sie bekommen die allgemeine Idee. Offensichtlich puffert dies nicht wie die FILE *
Routinen tun; Ich suchte mehr nach den Formatbezeichnern und der Möglichkeit, die Zeichendaten zu erstellen, die in den Dateideskriptor geschrieben werden, anstatt mir Gedanken über das Puffern der Daten zu machen, während sie geschrieben werden.
-
dprintf
ist POSIX (Stand 2008), und Funktionen, die Daten stillschweigend abschneiden, sind normalerweise eine sehr schlechte Idee. Schleife zumindest mit größeren Puffern, bis es erfolgreich ist oder einen Fehler zurückgibt …– R.. GitHub HÖR AUF, EIS ZU HELFEN
22. November 2010 um 15:50 Uhr
-
Das ist cool. Meine gcc-Version hier ist etwas älter und wird immer noch angezeigt
dprintf
als nur eine GNU-Erweiterung.– Werden
22. November 2010 um 15:55 Uhr
Nein, gibt es standardmäßig nicht, aber die beiden machen unterschiedliche Dinge. fprint, als Teil von stdio, erledigt Dinge wie Buffer Reads und Writes, unterstützt ungetc usw. Die Verwendung eines fd umgeht all das und ruft das Betriebssystem direkt auf.
Sie sind also nicht austauschbar. Ein Flip-Flop zwischen ihnen würde die stdio-Pufferung vermasseln, wenn nichts anderes
Kichik
Sie können den Dateideskriptor als normale Datei öffnen, die von verarbeitet werden kann fprintf()
mit fdoopen.
-
Gerade entdeckt
dprintf
up-thread, was interessant aussieht, aber als ich das gelesen habe, kam mir ein Gedanke: wie schlimm wäre es, a zu bestehenfd
in eine Funktion und Aufruffdopen(fd)
jeden einzelnen Funktionsaufruf, wenn Leistung kein Problem wäre? Ich stelle mir vor, dass dies wahrscheinlich zumindest wie verrückt Speicher lecken würde. (Und dann gibt es Implementierungsunterschiede zu berücksichtigen, vielleicht würden einige Implementierungen durchsickern und andere nicht.) Oder vielleicht das möchten Arbeit?– i336_
5. November 2021 um 1:45 Uhr
-
Gerade entdeckt
dprintf
up-thread, was interessant aussieht, aber als ich das gelesen habe, kam mir ein Gedanke: wie schlimm wäre es, a zu bestehenfd
in eine Funktion und Aufruffdopen(fd)
jeden einzelnen Funktionsaufruf, wenn Leistung kein Problem wäre? Ich stelle mir vor, dass dies wahrscheinlich zumindest wie verrückt Speicher lecken würde. (Und dann gibt es Implementierungsunterschiede zu berücksichtigen, vielleicht würden einige Implementierungen durchsickern und andere nicht.) Oder vielleicht das möchten Arbeit?– i336_
5. November 2021 um 1:45 Uhr