uot;Number b = %.2f", b); // 浮点数,保留两位小数
printf("String s = %s", s); // 字符串
printf()
的写法与scanf()
十分相像。区别在于scanf()
中一般只有格式控制字符,而没有其他普通字符,而printf()
中常常是在一串字符中把要替换的内容写为格式控制字符,从而形成格式化输出的效果。
puts()
将字符串和一个尾随的换行符\n
写入到stdout
的缓冲区。根据行缓冲的性质,终端也会立即进行打印显示。
用法示例:
puts("hello"); // 立即输出hello并换行
puts()
对换行符的处理与gets()
“相反”。gets()
会自动丢弃一个换行符,而puts()
则是自动写入一个换行符。
fputs()
将字符串写入指定输出流,可以是文件流、stdout
或stderr
等。stderr
是标准错误流,它是无缓冲的,会立即输出到屏幕,而不是等待换行符才输出。
用法示例:
fputs("hello world", stdout); // 不会立即输出
fputs("hello world\n", stdout); // 立即输出
fputs("hello world", stderr); // 立即输出
与fgets()
一样,fputs()
不会主动操作换行符。如果希望立即输出,需要自己加上换行符\n
。
fputc() & putc()
将一个字符写入指定输出流,可以是文件流、stdout
或stderr
等。
用法示例:
char c = 'q';
fputc(c, stdout);
c = '\n';
putc(c, stdout);
fputc()
和putc()
只是把字符写入stdout
,没有任何额外操作。因此如果希望立即输出,需要自己加上换行符\n
。
putchar()
将一个字符写入到标准输出流stdout
。
用法示例:
char c = 'x';
putchar(c);
同上,putchar()
不操作换行符。如果希望立即输出,需要自己加上换行符\n
。
fflush()
该函数的功能是强制刷新缓冲区,将数据立即写到对应的文件(或设备)。其参数可以是文件流指针,也可以是stdout
。
用法示例:
fputs("Hello World!", stdout);
fflush(stdout);
while (1);
上面的程序在进入死循环前,会输出Hello World!
字符串到屏幕。
注意:不能够将fflush()
用于stdin
!这可能导致不可预料的后果。
cout
cout
是ostream
类的一个实例。cout
是行缓冲的。
用法示例:
char str[] = "hello world";
cout << "str: " << str << endl;
插入endl
对象时,将立即清空输出缓冲区并显示,然后输出一个换行符\n
。
也有cout.put()
等函数,不常用。
cerr
cerr
是标准错误流,也是ostream
类的一个实例,并默认输出设备为显示屏上的命令行终端。它默认与stderr
同步。
cerr
是非缓冲的,即插入数据时会立即输出。
用法示例:
char str[] = "File open FAILED!";
cerr << "[Error] " << str;
clog
clog
是标准日志流,也是ostream
类的一个实例,并默认输出设备为显示屏上的命令行终端。
clog
是有缓冲的,但具体的刷新条件没有找到资料。实测以下代码是可以输出在屏幕的:
clog << "Failed!";
while(1){}
总结
标准输出相比输入来说较为简单。需要注意的是stdout
和cout
是行缓冲的,而stderr
和cerr
是无缓冲的。
C++ 流的高级用法请参考其他资料。