fprintf, printf和sprintf之间的区别?

谁能用简单的英语举例说明printffprintfsprintf之间的区别?

它在哪条小溪里?

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

253236 次浏览

printf(...)等价于fprintf(stdout,...)

fprintf用于输出到流。

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

注意还有vsprintfvfprintfvprintf

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)

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

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

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

在这个例子中,stdin现在指向inputfile.datstdout指向output.txt,而stderr指向errors.txt

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

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

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

fprintf这与流有关,因为printf是一个类似于fprintf的语句,但与流无关,也就是说fprintf是与文件相关的

sprintf:将格式化的数据写入内存中的字符串,而不是stdout

sprintf的语法是:

#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);

在这里,

String指的是指向要写入数据的内存缓冲区的指针。

Format指的是指向定义格式的字符串的指针。

每个项都是一个变量或表达式,指定要写入的数据。

如果操作成功,则sprintf返回的值大于或等于零,或者换句话说,返回写入的字符数(不包括结束空字符),如果发生错误,则返回小于零的值。

printf:打印到标准输出

printf的语法是:

printf format [argument]…

sprintf()和printf()之间的唯一区别是,sprintf()将数据写入字符数组,而printf()将数据写入标准输出设备stdout。

printf

  1. Printf用于在屏幕上执行输出。
  2. syntax = printf("control string ", argument );
  3. 它与文件输入/输出没有关联

  1. 它用来在file句柄指向的文件中执行写操作的fprintf。
  2. 语法是fprintf (filename, "control string ", argument );
  3. 它与文件输入/输出相关联
  • printf(const char *format, ...)用于将数据打印到标准输出上,标准输出通常是计算机显示器。
  • sprintf(char *str, const char *format, ...)类似于printf。它不是在标准输出(即监视器)上显示格式化的字符串,而是将格式化的数据存储在由char指针(第一个参数)指向的字符串中。字符串位置是printf和sprint语法的唯一区别。
  • fprintf(FILE *stream, const char *format, ...)又像printf。在这里,不是在监视器上显示数据,或将其保存在某个字符串中,格式化的数据保存在文件中,该文件由文件指针指向,该文件指针用作fprintf的第一个参数。文件指针是printf语法中唯一添加的内容。

如果stdout文件被用作fprintf中的第一个参数,那么它的工作将被认为等同于printf

其他人已经提供了详细的解释;我将通过一个非常基本的例子,将我的回答限制在print vs sprintf的实际讨论中。

假设您希望程序同时输出当前行号和文件名。具体来说,您希望:(i)将其打印在屏幕上,(ii)将其保存在变量中,以备将来使用。你可以对(i)使用printf,对(ii)使用sprintf。下面是代码。

/* 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;
}