谁能用简单的英语举例说明printf、fprintf和sprintf之间的区别?

它在哪条小溪里?

在阅读“C语言中的文件处理”时,我真的很困惑这三个。


当前回答

在C语言中,“流”是一种抽象;从程序的角度来看,它只是字节的生产者(输入流)或消费者(输出流)。它可以对应于磁盘上的文件、管道、终端或打印机或tty等其他设备。FILE类型包含关于流的信息。通常,您不会直接打乱FILE对象的内容,只需将指向它的指针传递给各种I/O例程。

有三个标准流:stdin是指向标准输入流的指针,stdout是指向标准输出流的指针,stderr是指向标准错误输出流的指针。在交互会话中,这三个通常指向你的控制台,尽管你可以将它们重定向到其他文件或设备:

$ myprog < inputfile.dat > output.txt 2> errors.txt

在这个例子中,stdin现在指向inputfile.dat, stdout指向output.txt, stderr指向errors.txt。

Fprintf将格式化文本写入指定的输出流。

Printf相当于写入fprintf(stdout,…),并将格式化文本写入标准输出流当前指向的任何地方。

Sprintf将格式化文本写入char数组,而不是流。

其他回答

printf

Printf用于在屏幕上执行输出。 语法= printf("控制字符串",参数); 它与文件输入/输出没有关联

它用来在file句柄指向的文件中执行写操作的fprintf。 语法是fprintf(文件名,“控制字符串”,参数); 它与文件输入/输出相关联

Printf(…)等价于fprintf(stdout,…)。

Fprintf用于输出到流。

Sprintf (buffer,…)用于将字符串格式化为缓冲区。

注意还有vsprintf, vfprintf和vprintf

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.

如果在fprintf中使用stdout文件作为第一个参数,那么它的工作将被认为与printf的工作等效。

Printf输出到标准输出流(stdout)

fprintf转到文件句柄(file *)

Sprintf进入您分配的缓冲区。(char *)

你也可以用vsnprintf()函数做一些非常有用的事情:

$ 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)