printf()在linux系统imx6平台下向终端输出迟缓问题 包括fprintf()、sprintf()

转载自: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 );
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值