Kan iemand in eenvoudig Engels uitleggen wat de verschillen zijn tussen printf
, fprintf
en sprintf
met voorbeelden?
In welke stream zit het?
Ik ben echt in de war tussen deze drie tijdens het lezen over “Bestandsverwerking in C”.
Antwoord 1, autoriteit 100%
In C is een “stroom” een abstractie; vanuit het perspectief van het programma is het gewoon een producent (invoerstroom) of consument (uitvoerstroom) van bytes. Het kan overeenkomen met een bestand op schijf, met een pijp, met uw terminal of met een ander apparaat zoals een printer of tty. Het type FILE
bevat informatie over de stream. Normaal gesproken knoei je niet direct met de inhoud van een FILE
object, je geeft er gewoon een verwijzing naar door aan de verschillende I/O-routines.
Er zijn drie standaard streams: stdin
is een verwijzing naar de standaard invoerstroom, stdout
is een verwijzing naar de standaard uitvoerstroom en stderr
is een verwijzing naar de standaardfoutuitvoerstroom. In een interactieve sessie verwijzen de drie meestal naar uw console, hoewel u ze kunt omleiden om naar andere bestanden of apparaten te verwijzen:
$ myprog < inputfile.dat > output.txt 2> errors.txt
In dit voorbeeld verwijst stdin
nu naar inputfile.dat
, stdout
verwijst naar output.txt
, en stderr
verwijst naar errors.txt
.
fprintf
schrijft opgemaakte tekst naar de uitvoerstroom die u opgeeft.
printf
is gelijk aan het schrijven van fprintf(stdout, ...)
en schrijft opgemaakte tekst naar waar de standaard uitvoerstroom momenteel naar wijst.
sprintf
schrijft opgemaakte tekst naar een array van char
, in tegenstelling tot een stream.
Antwoord 2, autoriteit 63%
printf
voert uit naar de standaard uitvoerstroom (stdout
)
fprintf
gaat naar een bestandsingang (FILE*
)
sprintf
gaat naar een buffer die je hebt toegewezen. (char*
)
Antwoord 3, autoriteit 17%
printf(“format”, args) wordt gebruikt om de gegevens af te drukken op de standaarduitvoer, wat vaak een computermonitor is.
sprintf(char *, “format”, args) is als printf. In plaats van de geformatteerde string weer te geven op de standaarduitvoer, d.w.z. een monitor, slaat het de geformatteerde gegevens op in een string waarnaar wordt verwezen door de char-aanwijzer (de allereerste parameter). De stringlocatie is het enige verschil tussen printf en sprint syntax.
fprintf(FILE *fp, “format”, args) is weer zoals printf. Hier, in plaats van de gegevens op de monitor weer te geven, of op te slaan in een string, worden de geformatteerde gegevens opgeslagen in een bestand waarnaar wordt verwezen door de bestandsaanwijzer die wordt gebruikt als de eerste parameter voor fprintf. De bestandsaanwijzer is de enige toevoeging aan de syntaxis van printf.
Als het bestand stdoutwordt gebruikt als de eerste parameter in fprintf, wordt de werking ervan beschouwd als gelijkwaardig aan die van printf.
Antwoord 4, autoriteit 10%
printf(...)
is gelijk aan fprintf(stdout,...)
.
fprintf
wordt gebruikt om te streamen.
sprintf(buffer,...)
wordt gebruikt om een string op te maken in een buffer.
Let op: er zijn ook vsprintf
, vfprintf
en vprintf
Antwoord 5
Je kunt ook heel nuttige dingen doen met de vsnprintf()-functie:
$ cat test.cc
#include <exception>
#include <stdarg.h>
#include <stdio.h>
struct exception_fmt : std::exception
{
exception_fmt(char const* fmt, ...) __attribute__ ((format(printf,2,3)));
char const* what() const throw() { return msg_; }
char msg_[0x800];
};
exception_fmt::exception_fmt(char const* fmt, ...)
{
va_list ap;
va_start(ap, fmt);
vsnprintf(msg_, sizeof msg_, fmt, ap);
va_end(ap);
}
int main(int ac, char** av)
{
throw exception_fmt("%s: bad number of arguments %d", *av, ac);
}
$ g++ -Wall -o test test.cc
$ ./test
terminate called after throwing an instance of 'exception_fmt'
what(): ./test: bad number of arguments 1
Aborted (core dumped)
Antwoord 6
printf
- printf wordt gebruikt om uitvoer op het scherm uit te voeren.
- syntaxis =
printf("control string ", argument );
- Het is niet geassocieerd met Bestandsinvoer/uitvoer
fprintf
- De fprintf die het gebruikte om de schrijfbewerking uit te voeren in het bestand waarnaar wordt verwezen door de FILE-handle.
- De syntaxis is
fprintf (filename, "control string ", argument );
- Het wordt geassocieerd met invoer/uitvoer van bestanden
Antwoord 7
fprintf
Dit is gerelateerd aan streams waarbij als printf
een statement is vergelijkbaar met fprintf
maar niet gerelateerd aan streams, dat wil zeggen fprintf
is bestand gerelateerd
Antwoord 8
sprintf: schrijft geformatteerde gegevens naar een tekenreeks in het geheugen in plaats van stdout
Syntaxis van sprintf is:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Hier,
String verwijst naar de aanwijzer naar een buffer in het geheugen waar de gegevens moeten worden geschreven.
Formaat verwijst naar een aanwijzer naar een tekenreeks die het formaat definieert.
Elk item is een variabele of uitdrukking die de te schrijven gegevens specificeert.
De waarde die wordt geretourneerd door sprintf is groter dan of gelijk aan nul als de bewerking succesvol is of met andere woorden het aantal geschreven tekens, het afsluitende null-teken niet meegerekend, wordt geretourneerd en retourneert een waarde kleiner dan nul als er een fout is opgetreden.
printf: Afdrukken naar stdout
Syntaxis voor printf is:
printf format [argument]…
Het enige verschil tussen sprintf() en printf() is dat sprintf() gegevens naar een tekenreeks schrijft, terwijl printf() gegevens schrijft naar stdout, het standaard uitvoerapparaat.