• fprintf、fflush(stdout)、printf、sprintf与fprintf 的用法区分


    1: fprintf:


         fprintf是用于文件操作的,原型是int fprintf( FILE *stream, const char *format [, argument ]...);fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件。fprintf()的返回值是输出的字符数,发生错误时返回一个负值.

        char name[20] = "Mary";
        FILE *out;
        out = fopen( "output.txt", "w" );//若不存在该文件,则将在应用程序目录下新建一个文件
        if( out != NULL )
        fprintf( out, "Hello %s\n", name );
    对于其输出格式参数,和printf()一样.

    fprintf也可以输出到屏幕而非文件中printf(...)=fprintf(stdout,...).

    stdout是标准输出设备的文件句柄宏定义
    printf其实就是fprintf的第一个参数设置为stdout
    你可以理解为它就是一个文件,而这个文件和标准输出设备(屏幕)建立了某种关联,当数据写到这个文件里面的时候,屏幕就会通过既定的方式把你写进去的东西显示出来

    2:fflush(stdout):
    表头文件:#include <stdio.h>
    定义函数:int fflush(FILE *stream)
    函数说明:fflush()会强迫将缓冲区内的数据写回参数stream指定的文件中。如果参数stream为NULL, fflush()会将所有打开的文件数据更新。
    返回值   :成功则返回0,  失败返回EOF, 错误代码存于errno中

    用途:在使用多个输出函数连续进行多次输出时,有可能发现输出错误。因为下一个数据在上一个数据还没输出完毕,还在输出缓冲区中时,下一个printf就把另一个数据加入输出缓冲区,结果冲掉了原来的数据,出现输出错误。 在 printf()后加上fflush(stdout); 强制马上输出,例子:

    #include<stdio.h>
    #include<unistd.h>//unix环境
    int main()
    {
            printf("hello");
            fflush(stdout);
            fork();//fork()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事
            return 0;
    }

    这样输出一个hello
    #include<stdio.h>
    #include<unistd.h>
    int main()
    {
            printf("hello");
    //      fflush(stdout);
            fork();
            return 0;
    }

    这样会输出两个hello

    3:printf、sprintf与fprintf 的用法区分:该部分引自:文章转自:http://www.cnblogs.com/stli/admin/EditArticles.aspx

    1.printf 是和标准输出文件(stdout)关联的,fprintf 则没有这个限制.
     
    2.fprintf是用于文件操作的,原型是int fprintf( FILE *stream, const char *format [, argument ]...);

    3.sprintf是格式化输出到一个字符串,fprintf是格式化输出到一个stream,通常是到文件。
     
    int   fprintf(   FILE   *stream,   const   char   *format   [,   argument   ]...);  
    int   sprintf(   char   *buffer,   const   char   *format   [,  argument]   ...   );

  • 相关阅读:
    十六、Redis与MySQL数据双写一致性 —— Canal Demo
    十三、redis分布式锁:缓存续命
    十二、redis分布式锁:单机和多机及案例
    十七、缓存双写一致性之更新策略探讨
    十四、Redis的缓存过期淘汰策略
    自定义类型转换器
    [译]. NET 6 新增API 上
    EF 6 新特性三
    EF 6 新特性二
    [译]. NET 6 新增API 下
  • 原文地址:https://www.cnblogs.com/KingOfFreedom/p/2805289.html
Copyright © 2020-2023  润新知