任何人都可以用简单的英语解释 printf , fprintf 和 sprintf 与示例之间的区别吗?
printf
fprintf
sprintf
它是什么流?
在阅读“C中的文件处理”时,我对其中的三个感到困惑 .
在C中,"stream"是一个抽象;从程序的角度来看,它只是字节的 生产环境 者(输入流)或消费者(输出流) . 它可以对应于磁盘上的文件,管道,终端或某些其他设备(如打印机或tty) . FILE 类型包含有关流的信息 . 通常,您不会直接使用 FILE 对象的内容,只需将指针传递给各种I / O例程即可 .
FILE
有三个标准流: stdin 是指向标准输入流的指针, stdout 是指向标准输出流的指针, stderr 是指向标准错误输出流的指针 . 在交互式会话中,三者通常会引用您的控制台,但您可以将它们重定向到指向其他文件或设备:
stdin
stdout
stderr
$ myprog < inputfile.dat > output.txt 2> errors.txt
在此示例中, stdin 现在指向 inputfile.dat , stdout 指向 output.txt , stderr 指向 errors.txt .
inputfile.dat
output.txt
errors.txt
fprintf 将格式化文本写入您指定的输出流 .
printf 相当于编写 fprintf(stdout, ...) 并将格式化文本写入标准输出流当前指向的位置 .
fprintf(stdout, ...)
sprintf 将格式化文本写入 char 数组,而不是流 .
char
printf 输出到标准输出流( stdout )
fprintf 转到文件句柄( FILE* )
FILE*
sprintf 转到您分配的缓冲区 . ( char* )
char*
printf ("format",args)用于将数据打印到标准输出上,标准输出通常是计算机显示器 .
sprintf (char *,"format",args)就像printf . 而是在标准输出(即监视器)上显示格式化字符串,它将格式化数据存储在由char指针指向的字符串中(第一个参数) . 字符串位置是printf和sprint语法之间的唯一区别 .
fprintf (FILE * fp,"format",args)再次像printf . 这里不是在监视器上显示数据,或者将其保存在某个字符串中,而是将格式化数据保存在文件指针所指向的文件中,该文件指针用作fprintf的第一个参数 . 文件指针是printf语法的唯一补充 .
如果将stdout文件用作fprintf中的第一个参数,则其工作被认为与printf的工作相同 .
printf(...) 相当于 fprintf(stdout,...) .
printf(...)
fprintf(stdout,...)
fprintf 用于输出到流 .
sprintf(buffer,...) 用于将字符串格式化为缓冲区 .
sprintf(buffer,...)
注意还有 vsprintf , vfprintf 和 vprintf
vsprintf
vfprintf
vprintf
你也可以用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)
的printf
printf用于在屏幕上执行输出 .
syntax = printf("control string ", argument );
printf("control string ", argument );
它与文件输入/输出无关
fprintf中
用于在FILE句柄指向的文件中执行写入操作的fprintf .
语法为 fprintf (filename, "control string ", argument );
fprintf (filename, "control string ", argument );
它与文件输入/输出相关联
fprintf 这与流相关,其中 printf 是类似于 fprintf 但与流无关的语句,即 fprintf 与文件相关
sprintf:将格式化数据写入内存中的字符串而不是stdout
sprintf的语法是:
#include <stdio.h> int sprintf (char *string, const char *format [,item [,item]…]);
这里,
String指向内存中要写入数据的缓冲区的指针 .
格式是指指向定义格式的字符串的指针 .
每个项目都是一个变量或表达式,用于指定要写入的数据 .
如果操作成功,则sprintf返回的值大于或等于零,或者换句话说,返回写入的字符数,不计算终止空字符,如果发生错误则返回小于零的值 .
printf:打印到stdout
printf的语法是:
printf format [argument]…
sprintf()和printf()之间的唯一区别是sprintf()将数据写入字符数组,而printf()将数据写入标准输出设备stdout .
8 回答
在C中,"stream"是一个抽象;从程序的角度来看,它只是字节的 生产环境 者(输入流)或消费者(输出流) . 它可以对应于磁盘上的文件,管道,终端或某些其他设备(如打印机或tty) .
FILE
类型包含有关流的信息 . 通常,您不会直接使用FILE
对象的内容,只需将指针传递给各种I / O例程即可 .有三个标准流:
stdin
是指向标准输入流的指针,stdout
是指向标准输出流的指针,stderr
是指向标准错误输出流的指针 . 在交互式会话中,三者通常会引用您的控制台,但您可以将它们重定向到指向其他文件或设备:在此示例中,
stdin
现在指向inputfile.dat
,stdout
指向output.txt
,stderr
指向errors.txt
.fprintf
将格式化文本写入您指定的输出流 .printf
相当于编写fprintf(stdout, ...)
并将格式化文本写入标准输出流当前指向的位置 .sprintf
将格式化文本写入char
数组,而不是流 .printf
输出到标准输出流(stdout
)fprintf
转到文件句柄(FILE*
)sprintf
转到您分配的缓冲区 . (char*
)printf ("format",args)用于将数据打印到标准输出上,标准输出通常是计算机显示器 .
sprintf (char *,"format",args)就像printf . 而是在标准输出(即监视器)上显示格式化字符串,它将格式化数据存储在由char指针指向的字符串中(第一个参数) . 字符串位置是printf和sprint语法之间的唯一区别 .
fprintf (FILE * fp,"format",args)再次像printf . 这里不是在监视器上显示数据,或者将其保存在某个字符串中,而是将格式化数据保存在文件指针所指向的文件中,该文件指针用作fprintf的第一个参数 . 文件指针是printf语法的唯一补充 .
如果将stdout文件用作fprintf中的第一个参数,则其工作被认为与printf的工作相同 .
printf(...)
相当于fprintf(stdout,...)
.fprintf
用于输出到流 .sprintf(buffer,...)
用于将字符串格式化为缓冲区 .注意还有
vsprintf
,vfprintf
和vprintf
你也可以用vsnprintf()函数做很有用的事情:
的printf
printf用于在屏幕上执行输出 .
syntax =
printf("control string ", argument );
它与文件输入/输出无关
fprintf中
用于在FILE句柄指向的文件中执行写入操作的fprintf .
语法为
fprintf (filename, "control string ", argument );
它与文件输入/输出相关联
fprintf
这与流相关,其中printf
是类似于fprintf
但与流无关的语句,即fprintf
与文件相关sprintf:将格式化数据写入内存中的字符串而不是stdout
sprintf的语法是:
这里,
String指向内存中要写入数据的缓冲区的指针 .
格式是指指向定义格式的字符串的指针 .
每个项目都是一个变量或表达式,用于指定要写入的数据 .
如果操作成功,则sprintf返回的值大于或等于零,或者换句话说,返回写入的字符数,不计算终止空字符,如果发生错误则返回小于零的值 .
printf:打印到stdout
printf的语法是:
sprintf()和printf()之间的唯一区别是sprintf()将数据写入字符数组,而printf()将数据写入标准输出设备stdout .