转载自:https://blog.csdn.net/dkqiang/article/details/10149595
最近写应用程序在imx6 linux系统下运行向终端打印数据使用了printf()函数,但出现了打印不出的情况。根据转载的文章,得知原因如下:
在linux系统下,printf函数是行缓冲式的输出,当printf遇到\n时,或者缓冲区满时,才会将缓冲区里的内容刷新到标准输出(stdout)。因此, printf("p"); 等语句的显示不能立刻显示在屏幕上,但是printf("p\n"); 可以。
为了解决这个问题可以通过:fflush(stdout);解决,即变成:
printf("p");
fflush(stdout);(fflush是一个计算机函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。)
相对printf,使用fprintf的好处:
printf函数的接口如下所示:
int printf( const char *format [, argument]... );
fprintf函数的接口如下所示:
int fprintf( FILE *stream, const char *format [, argument ]...);
从接口可以看出,使用printf函数会更方便些,少了一个函数参数。在通常情况下,的确是这样的。但在输出信息比较多,而且输出的信息有可能需要分类的化,使用fprintf的好处就体现出来了。
printf函数使用的输出设备是标准输出设备,即stdout。在使用fprintf函数时,我们可以在第一个参数使用stdout或stderr进行输出信息分类。虽然stdout和stderr在正常情况下都指向标准输出设备,但通常程序运行时的命令行参数,可以分别控制stdout和stderr指向不同的设备或文件。这样,就可以达到对输出信息进行分类控制了。如下面的代码段所示:
test.c
//一般输出信息
extern char *info;
extern char *errinfo;
fprintf(stdout, "%s", info);
//特别关注的输出信息
fprintf(stderr, "%s", errinfo);
这样,在运行程序时,可以使用如下的命令行:
test 1&>1.txt 2&>2.txt (在ubuntu下测试,使用printf、fprintf(stdout)、fprintf(stderr)输出都指向了2.txt)
这样,一般输出信息可以存储到1.txt文件中,特别关注的输出信息可以存储到2.txt文件中。
许多UNIX shell可以把标准输出文件(STDOUT)和标准错误文件(STDERR)都重定向到同一个文件,例如在Bourne Shell(sh)中。
STDIN 的文件描述符为 0
STDOUT 的文件描述符为 1
STDERR 的文件描述符为 2
sprintf指的是字符串格式化命令,主要功能是把格式化的数据写入某个字符串中。sprintf 是个变参函数。使用sprintf 对于写入buffer的字符数是没有限制的,这就存在了buffer溢出的可能性。
头文件:stdio.h
原型:int sprintf( char *buffer, const char *format, [ argument] … );
参数列表
buffer:char型指针,指向将要写入的字符串的缓冲区。
format:格式化字符串。
[argument]...:可选参数,可以是任何类型的数据。
sprintf 返回以format为格式argument为内容组成的结果被写入buffer 的字节数,结束字符‘\0’不计入内。即,如果“Hello”被写入空间足够大的buffer后,函数sprintf 返回5。
// 程序使用sprintf 将各种数据格式化后置于字符数组buffer中
#include <stdio.h>
int
main(
void
)
{
char
buffer[200], s[] =
"computer"
, c =
'l'
;
int
i = 35, j;
float
fp = 1.7320534f;
// 格式化并打印各种数据到buffer
j =
sprintf
( buffer,
" String: %s\n"
, s );
// C4996
j +=
sprintf
( buffer + j,
" Character: %c\n"
, c );
// C4996
j +=
sprintf
( buffer + j,
" Integer: %d\n"
, i );
// C4996
j +=
sprintf
( buffer + j,
" Real: %f\n"
, fp );
// C4996
printf
(
"Output:\n%s\ncharacter count = %d\n"
, buffer, j );
}