zoukankan      html  css  js  c++  java
  • sprintf()、fprintf()、fscanf()的用法

     

    sprintf函数的用法
    1、该函数包含在stdio.h的头文件中。

    2、sprintf和平时我们常用的printf函数的功能很相似。sprintf函数打印到字符串中,而printf函数打印输出到屏幕上。sprintf函数在我们完成其他数据类型转换成字符串类型的操作中应用广泛。

    3、sprintf函数的格式:
    int sprintf( char *buffer, const char *format [, argument,...] );
    除了前两个参数固定外,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串(像:"%3d%6.2f%#x%o",%与#合用时,自动在十六进制数前面加上0x)。只要在printf中可以使用的格式化字符串,在sprintf都可以使用。其中的格式化字符串是此函数的精华。

    4、char str[20];
     double f=14.309948;
    sprintf(str,"%6.2f",f);
    可以控制精度。

    5、char str[20];
    int a=20984,b=48090;
    sprintf(str,"%3d%6d",a,b);
    str[]="20984 48090"
    可以将多个数值数据连接起来。

    6、char str[20];
    char s1[5]={'A','B','C'};
    char s2[5]={'T','Y','x'};
    sprintf(str,"%.3s%.3s",s1,s2);
    可以将多个字符串连接成字符串
    %m.n在字符串的输出中,m表示宽度,字符串共占的列数;n表示实际的字符数。%m.n在浮点数中,m也表示宽度;n表示小数的位数。

    7、可以动态指定,需要截取的字符数
    char s1={'A','B','C'};
    char s2={'T','Y','x'};
    sprintf(str,"%.*s%.*s",2,s1,3,s2);
    sprintf(s, "%*.*f", 10, 2, 3.1415926);

    8、sprintf(s, "%p", &i);
    可以打印出i的地址
    上面的语句相当于
    sprintf(s, "%0*x", 2 * sizeof(void *), &i);

    9、sprintf的返回值是字符数组中字符的个数,即字符串的长度,不用在调用strlen(s)求字符串的长度。

    原文传送门:请点击

     

    fprintf、fscanf的读写对象不是终端而是磁盘文件。

    调用方式为:int   fprintf(文件指针,格式字符串,输出表列 )返回值:返回实际输出的字符数,操作不成功返回EOF。

    int fscanf(文件指针,格式字符串,输入表列 )返回值:返回输入的数据个数,操作不成功返回EOF。
    fprintf(fp, "%d, %6.2f",   i, t)将整型变量 i 和实型变量 t 的值按%d和%6.2f的格式输出到fp所指向的文件中;若i=3,t=4.5,则输出到磁盘中的格式为:3, 4.50。相应的,从文件中读取数据时,则应用:fscanf(fp, "%d, %f",   &i, &t)。

     

    在运用fprintf与fscanf时,在向文件输出数据及从文件读取数据时,分隔符应该相一致。如下程序所示,该程序的功能是:用户输入8个整型数据,程序回显并把数据写到int.txt文件中,然后程序再从int.txt文件中读取数据,并显示出来。

    #include <stdio.h>
    main()
    {
       FILE *fp;
       int i,ss[8],new[8];
       for(i=0;i<8;i++){
         scanf("%d",&ss[i]);
       }
       fp=fopen("int.txt","w");
       printf("start diesplay old data!/n");
       for(i=0;i<8;i++){
          printf("%d:%-10d/n",i+1,ss[i]);
          fprintf(fp,"%d,",ss[i]);  /*输出数据时以逗号为数据之间的分隔符*/
       }
       fclose(fp);
       printf("Now diseplay read date!/n");
        if((fp=fopen("int.txt","r"))==NULL) return 1;
        for(i=0;i<8;i++){
          fscanf(fp,"%d,",&new[i]);  /*输入数据时以逗号为数据之间的分隔符,这样做到前后一致,                                                                                 读取数据不会错*/
    
          printf("%d:%-10d/n",i+1,new[i]);
        }
        fclose(fp);
    }

     

    分隔符也可采用/n,即回车符,那么程序中二句相应改为:
    fprintf(fp,"%d/n",ss[i]);
    fscanf(fp,"%d/n",&new[i]); 

     

     

    使用fprintf和fscanf的优点:

    使用fread和fwrite的优点就是二进制的读取是最快的。但是它们有缺陷,就是在读取的时候 while(!feof(fp)) 不精确,往往会发现它多循环了一次。因为feof()是根据剩余字符来判断是否文件结尾的,而文件的结尾标识符是'/0'是两个字节,在读取'/'的时候feof()还是为false只有读取完'/0'的时候feof()==true。致使产生多余的循环(如果使用while(!feof(fp))的话)。使用fprintf和fscanf,因为这两个函数具有输入/输出的格式限制,即使在读取'/0'处有多余的循环,但由于其不满足输入/输出格式,所以多余的循环被屏蔽掉。最好就是这样:"%d/t%d/t" 这样的每个数字后面都是有限制的,这样就可以起到很好的屏蔽作用。^^

     

     

    对文件的读和写是最常用的文件操作。在C语言中提供了多种文件读写的函数:

    ·字符读写函数 :fgetc和fputc

    ·字符串读写函数:fgets和fputs

    ·数据块读写函数:fread和fwrite

    ·格式化读写函数:fscanf和fprinf

    随着每次数据的读取,文件流指针fp都作相应的移动

     

    参考原文:https://blog.csdn.net/sdhfll/article/details/1892926

  • 相关阅读:
    touchesBegan: withEvent: <--- with UIScrollView / UIImageView
    #ifdef,#else,#endif,#if 拾忆
    内联函数 inline 漫谈
    WebKit框架 浅析
    在iOS中获取UIView的所有层级结构 相关
    initWithFrame、initWithCoder、awakeFromNib的区别和调用次序 & UIViewController生命周期 查缺补漏
    iOS 常用代码块
    NSObject Class 浅析
    Alamofire 框架浅析
    ReactiveX--响应式编程の相关概念 浅析
  • 原文地址:https://www.cnblogs.com/mlgjb/p/8666132.html
Copyright © 2011-2022 走看看