248

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".

Michael Irigoyen
  • 21,233
  • 17
  • 82
  • 125
Vishwanath Dalvi
  • 31,604
  • 36
  • 115
  • 146
  • 4
    Experiment with them by writing some sample code. That is very easy way to *clearly* understand the difference between them. – Nawaz Jan 07 '11 at 15:56
  • 16
    Prefer snprintf() to sprintf() to avoid silly buffer overflows. – Maxim Egorushkin Jan 07 '11 at 16:00
  • 3
    Prefer streams or Boost formatters to avoid silly buffer overflows and nasty type-unsafety bugs – John Dibling Jan 07 '11 at 16:09
  • Streams and boost formatters may be too slow. – Maxim Egorushkin Jan 07 '11 at 16:13
  • 7
    @Maxim, whilst you raise a valid point I'll take the safety in knowledge that my buffers aren't going to overflow and explode my app in to pieces. I'd only ever look at these functions if the streams/boost formatters were shown to be causing noticeable bottlenecks. :) – Moo-Juice Jan 07 '11 at 16:17
  • I've dropped the C tag, those are C functions and while you can call them from C++, it's better not to, this way you'll avoid grumpy programmers (in C++, use streams) – Matthieu M. Jan 07 '11 at 16:21
  • @Maxim: Almost never. I use streams in production financial servers, processing 5 million messages per second, all day every day and they have never been an issue for me. – John Dibling Jan 07 '11 at 16:25
  • @Matthieu: I think you actually dropped the [c++] tag. Was this intended? – John Dibling Jan 07 '11 at 16:27
  • @John: type safety of streams is a bit overrated. Modern compilers check the arguments against the format string, just make sure you don't ignore these warnings or make them a hard error. And in the end of the day streams do call snprintf under the hood, so by not using streams you avoid layers of code. – Maxim Egorushkin Jan 07 '11 at 16:45
  • @John: 5M/sec messages is 200ns/msg. I bet you could do better than that if you drop using IOStreams. lol – Maxim Egorushkin Jan 07 '11 at 16:49
  • 1
    @Maxim: Point is, there's no need. My code isn't a bottleneck. 5m/sec is how many messages the exchange sends, not how many we're capable of processing. So why prematurely optimize? – John Dibling Jan 07 '11 at 16:58
  • @John: With market data and high-frequency trading the goal is often not throughput, but rather latency. – Maxim Egorushkin Jan 07 '11 at 17:01
  • @Maxim: I'm well-aware of this. Again it's not an issue in my experience. – John Dibling Jan 07 '11 at 17:10

8 Answers8

263

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.

Andrew
  • 4,822
  • 1
  • 19
  • 38
John Bode
  • 106,204
  • 16
  • 103
  • 178
  • 4
    "it is simply a producer (input stream) or consumer (output stream) of bytes." Are these backwards? Wouldn't a producer create (output) something? Asking because I genuinely do not know. – Dave Voyles Mar 06 '17 at 22:02
  • 7
    @DaveVoyles: These are from the perspective of your program. An input stream produces bytes for your program to read; an output stream consumes the bytes produced from your program. – John Bode Mar 06 '17 at 23:52
  • for anyone thinking what the `f` prefix/suffix is for. I initially thought the `f` in `printf` / `sprintf` / `scanf` means _file_. But it just means _format_. – Honey Mar 17 '21 at 13:10
165

printf outputs to the standard output stream (stdout)

fprintf goes to a file handle (FILE*)

sprintf goes to a buffer you allocated. (char*)

Moo-Juice
  • 36,340
  • 10
  • 69
  • 121
45

printf("format", args) is used to print the data onto the standard output which is often a computer monitor.

sprintf(char *, "format", args) 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 *fp, "format", args) 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.

gedamial
  • 1,466
  • 1
  • 14
  • 27
Rubal
  • 846
  • 11
  • 12
26

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

Post Self
  • 1,064
  • 2
  • 11
  • 31
VGE
  • 4,041
  • 15
  • 17
2

printf

  1. printf is used to perform output on the screen.
  2. syntax = printf("control string ", argument );
  3. It is not associated with File input/output

fprintf

  1. The fprintf it used to perform write operation in the file pointed to by FILE handle.
  2. The syntax is fprintf (filename, "control string ", argument );
  3. It is associated with file input/output
chux - Reinstate Monica
  • 113,725
  • 11
  • 107
  • 213
  • If this is quoted from somewhere else it's best to cite the source with a link, but definitely still keep the text you've quoted here. – SuperBiasedMan May 27 '15 at 15:58
2

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)
Maxim Egorushkin
  • 119,842
  • 14
  • 147
  • 239
0

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

Robert
  • 5,191
  • 43
  • 59
  • 113
kavamsi12
  • 1
  • 1
0

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.