Can anyone explain in simple English about the differences between printf
, fprintf
, and sprintf
with examples?
What stream is it in?
I'm really confused between the three of these while reading about "File Handling in C".
Can anyone explain in simple English about the differences between printf
, fprintf
, and sprintf
with examples?
What stream is it in?
I'm really confused between the three of these while reading about "File Handling in C".
In C, a "stream" is an abstraction; from the program's perspective it is simply a producer (input stream) or consumer (output stream) of bytes. It can correspond to a file on disk, to a pipe, to your terminal, or to some other device such as a printer or tty. The FILE
type contains information about the stream. Normally, you don't mess with a FILE
object's contents directly, you just pass a pointer to it to the various I/O routines.
There are three standard streams: stdin
is a pointer to the standard input stream, stdout
is a pointer to the standard output stream, and stderr
is a pointer to the standard error output stream. In an interactive session, the three usually refer to your console, although you can redirect them to point to other files or devices:
$ myprog < inputfile.dat > output.txt 2> errors.txt
In this example, stdin
now points to inputfile.dat
, stdout
points to output.txt
, and stderr
points to errors.txt
.
fprintf
writes formatted text to the output stream you specify.
printf
is equivalent to writing fprintf(stdout, ...)
and writes formatted text to wherever the standard output stream is currently pointing.
sprintf
writes formatted text to an array of char
, as opposed to a stream.
f
prefix/suffix is for. I initially thought the f
in printf
/ sprintf
/ scanf
means file. But it just means format. –
Crossbones printf
outputs to the standard output stream (stdout
)
fprintf
goes to a file handle (FILE*
)
sprintf
goes to a buffer you allocated. (char*
)
printf(const char *format, ...)
is used to print the data onto the standard output which is often a computer monitor.sprintf(char *str, const char *format, ...)
is like printf
. Instead of displaying the formated string on the standard output i.e. a monitor, it stores the formated data in a string pointed to by the char pointer (the very first parameter). The string location is the only difference between printf and sprint syntax.fprintf(FILE *stream, const char *format, ...)
is like printf
again. Here, instead of displaying the data on the monitor, or saving it in some string, the formatted data is saved on a file which is pointed to by the file pointer which is used as the first parameter to fprintf
. The file pointer is the only addition to the syntax of printf
.If stdout
file is used as the first parameter in fprintf
, its working is then considered equivalent to that of printf
.
printf(...)
is equivalent to fprintf(stdout,...)
.
fprintf
is used to output to stream.
sprintf(buffer,...)
is used to format a string to a buffer.
Note there is also vsprintf
, vfprintf
and vprintf
v
flavors are non-standard i believe –
Reposeful v
flavors are very certainly in the C standard. –
Shuck You can also do very useful things with vsnprintf() function:
$ 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)
vsnprintf
is a non-Standard function. Most implementations I've seen implement this or something like it, but it is implementation-specific. –
Reposeful printf
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf: Writes formatted data to a character string in memory instead of stdout
Syntax of sprintf is:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
Here,
String refers to the pointer to a buffer in memory where the data is to be written.
Format refers to pointer to a character string defining the format.
Each item is a variable or expression specifying the data to write.
The value returned by sprintf is greater than or equal to zero if the operation is successful or in other words the number of characters written, not counting the terminating null character is returned and returns a value less than zero if an error occurred.
printf: Prints to stdout
Syntax for printf is:
printf format [argument]…
The only difference between sprintf() and printf() is that sprintf() writes data into a character array, while printf() writes data to stdout, the standard output device.
fprintf
This is related with streams where as printf
is a statement similar to fprintf
but not related to streams, that is fprintf
is file related
Detailed explanations have already been provided by others; I'll limit my answer to a practical discussion on print
vs sprintf
, by means of a very basic example.
Suppose you want your program to output both, the current line number and the file name. Specifically, you wish to: (i) print this on your screen and, (ii) save it in a variable, for future use. You can use printf
for (i) and sprintf
for (ii). Here is the code.
/* saves file name and current line in a string and prints it on the screen*/
#include <stdio.h>
int main(void) {
/* note the use of a marco to save the line nr. */
int line_n= __LINE__;
/* note the use of a marco to save the file name */
char file_name[]= __FILE__;
/* Some text you wish to print/save */
char line[] = "Line ";
char file[]= " of file ";
char my_str[100];
/* expand everything and save it in my_str for future use */
sprintf(my_str, "%s%d%s%s", line, line_n, file, file_name);
/* or just print it out on the screen */
printf("%s", my_str);
return 0;
}
© 2022 - 2024 — McMap. All rights reserved.