任何人都可以用简单的英语有关之间的差异说明printf
, fprintf
以及sprintf
结合实例?
这是什么流?
在阅读有关“ C语言中的文件处理”的内容时,我确实对这三个方法感到困惑。
任何人都可以用简单的英语有关之间的差异说明printf
, fprintf
以及sprintf
结合实例?
这是什么流?
在阅读有关“ C语言中的文件处理”的内容时,我确实对这三个方法感到困惑。
Answers:
在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(“ 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
v
我相信这些口味是非标准的
v
味道很肯定C标准。
您还可以使用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)
vsnprintf
是一个非标准功能。我见过的大多数实现都实现了这个或类似的东西,但是它是特定于实现的。
打印
printf("control string ", argument );
fprintf
fprintf (filename, "control string ", argument );
sprintf:将格式化数据写入内存中的字符串,而不是标准输出
sprintf的语法是:
#include <stdio.h>
int sprintf (char *string, const char *format
[,item [,item]…]);
这里,
字符串是指向内存中要写入数据的缓冲区的指针。
格式是指指向定义格式的字符串的指针。
每个项目都是一个变量或表达式,用于指定要写入的数据。
如果操作成功,则sprintf返回的值大于或等于零;换句话说,返回的是不计算终止空字符的已写入字符数,如果发生错误,则返回小于零的值。
printf:打印到标准输出
printf的语法是:
printf format [argument]…
sprintf()和printf()之间的唯一区别是sprintf()将数据写入字符数组,而printf()将数据写入标准输出设备stdout。