020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> 软件应用 >> 编程开发 >> 正文
    stdio.h函式与格式化笔记

    点击:   发布日期:2013-01-19

    本文来自 www.020fix.com

    这是我个人整理出来的一篇stdio.h笔记
    我程式一路写来常常回翻这篇笔记,看到很多人一直重覆发问一些只要利用输出入格式化相关的函式就能轻易解决的问题
    却还是不懂得使用这类函式来解决问题,分享出来希望能让更多人受惠

    另外内容若有错误也请指正,或是有缺的内容也望各路高手一起修补

    键盘,萤幕输出入
        printf(const char* format, ...)
          格式化输出到萤幕
        puts(char*)
          输出字串至萤幕
        putchar(char)
          输出字元至萤幕
        scanf(const char* format, ...)
          格式化输入从键盘
        gets(char*)
          输入字串从键盘
        char getchar()
          输入字元从键盘

    char阵列(字元缓冲区)输出入
        sprintf(char* str,const char* format, ...)
          格式化输出至字元缓冲区
        sscanf(const char* str,const char* format, ...)
          格式化输入至字元缓冲区

    档案输出入
        FILE*   //档案结构体指标
        FILE* fopen (const char* filename, const char* mode)
          开启档案,若开启档案失败回传NULL
          mode代表的意义如下
            r   开启唯读档,档案必须存在
            r+  开启可读写档,档案必须存在
            w   开启唯写档,若档案存在将清理成空白,若档案不存在则建立该档案
            w+  开启可读写档,若档案存在将清理成空白,若档案不存在则建立该档案
            a   开启唯写档,若档案不存在建立该档,若档案存在则内容加到其后面
            a+  开启可读写档,若档案不存在建立该档,若档案存在则内容加到其后面
            b   和上述mode组合,代表档案为二进位档
        int fclose (FILE*)
          关闭档案,若关闭档案成功传回0失败传回-1
        fprintf(FILE* stream,const char* format, ...)
          格式化输出至档案
        fscanf(FILE* stream,const char* format, ...)
          格式化输入从档案
        fputc(int ch, FILE* stream)
          字元输出至档案,若写入失败回传EOF
        int fgetc(FILE*)
          字元输入从档案,若读取至结尾回传EOF
        fputs(const char*, FILE*)
          字串输出至档案
        char* fgets(char*, int, FILE*)
          字串输入从档案
        fseek (FILE* stream,long offset,int mode);
          移动档案滙流读写位置,offset将依据mode的值移动读写位置
          mode值有SEEK_SET(档案开头),SEEK_END(档案结尾),SEEK_CUR(目前位置),成功传回1,错误传回-1
        size_t fread(void* ptr,size_t size,size_t nmemb,FILE* stream)
          ptr为欲储存的位置,size为单笔的大小,nmemb为数量
          传回值为实际读取到的笔数,若比nmemb小则可能读到档尾或发生错误
        size_t fwrite(const void* ptr,size_t size,size_t nmemb,FILE* stream)
          ptr为欲储存的位置,size为单笔的大小,nmemb为数量
          传回值为实际写入的笔数
        feof(FILE* stream)
          检查档案是否读取至档尾,己到档尾传回非零值
        int remove(const char* pfthname)
          删除档案,成功传回0,失败传回1
        rename(const char* oldPath,const char* newPath)
          更改档案名称或位置,若newPath所指定的档案存在则会被删除,成功回传0,失败回传-1
        ferror(FILE* stream)
          检查档案汇流是否发生错误,有错误发生传回非0值
        perror(const char* s)
          印出上个函式发生的错误,先印出字串s再加上错误原因字串,错误原因由全域变数errno的值来决定
          
    文字档换行和档案结束字码补充
        EOF(0x1a)      档案结束字码
        0x0b           Carriage Return CR
        0x0a           Line Feed LF
        win环境中,文字档换行为CR+LF,unix环境则只有CR

    printf系列格式说明
      引数format字串包下三种字元型态
        1.一盘文字,如a b 1 2
        2.控制字元,如\n \t
        3.以%符号开头的格式字元,如%d %f %x

      格式字元型式如下
        %[flags][width][.prec]type
        []为选择性栏位,有需要再填

      [flags]
        - 会将此一数值向左对齐
        + 会将此一数值印出正负号
        # 针对各种进制数字会加印出其识别符号,针对小数点会加印0
        0 当有指定栏位时无数字的栏位会补上0

      [width]栏位的最小长度,若此栏位为*则长度将由引数决定

      [.prec]所使用的情况有下列五种
        1.正整数的最小位数
        2.在浮点数中代表小数位数
        3.在%g代表有效位数的最大值
        4.在%s代表字串的最大长度
        5.若为*符号则代表引数为最大长度

      type
        %d   整数的引数会被转成有号的十进位数字
        %u   整数的引数会被转成无号的十进位数字
        %o   整数的引数会被转成无号的八进位数字
        %x   整数的引数会被转成无号的十六进位数字,并以小写abcdef表示
        %X   整数的引数会被转成无号的十六进位数字,并以大写ABCDEF表示
        %f   double的引数会转成十进位的数字并取到小数点以下六位,四捨五入
        %e   double的引数以指数型态列印,有一个数字在小数点前六位数字在小数点后,而在指数部份会以小写的e表示
        %E   double的引数以指数型态列印,有一个数字在小数点前六位数字在小数点后,而在指数部份会以大写的E表示
        %g   double的引数会自动选择以%f或%e的格式来列印,其介定的方式是根据数值及所设定的有效位数来决定
        %G   double的引数会兴%g一样但印出指数时会以大写E表示
        %c   整数的引数会被转成unsigned char型态印出
        %s   指向字串的引数被逐字印出,直到出现NULL字元为止
        %p   用来列印位址,一般引数皆为void* 型态

    scanf系列格式说明
      scanf()会将输入的资料根据引数format字串来转换并格式化资料
      scanf()格式转换型式如下
        %[ * ][size][l][h]type
        []为选择性栏位,有需要再填

      [ * ]代表该对应的栏位资料忽略不储存
      [size]允许输入的资料长度
      [l]输入的数值以long int或double型态储存
      [h]输入的数值以short int型态储存

      type
        %d   输入的资料会被转成一有号的十进位数字(int)
        %i   输入的资料会被转成一有号的十进位数字,若输入资料以"ox"或"oX"开头代表转换成十六进位数字,若以"0"开头则转换成八进位数字
        %o   输入的资料会被转成无号的八进位数字
        %u   输入的资料会被转成无号的正整数
        %x   输入的资料会被转成无号的十六进位数字,转换后存于unsigned int型态变数
        %X   同%x
        %f   输入的资料为有号的浮点数,转换后存于float变数中
        %e   同%f
        %E   同%f
        %g   同%f
        %s   输入资料为空白字元为终止的字串
        %c   输入资料为单一字元
        []   读取资料但只允许中括号内的字元,如[a-z]
        [^]  读取资料但不允许中括号后的字元,如[^0-9]
    例:
        scanf("%10s",str);   输入字串,但只储存前10个字元到str中
        scanf("%[a-z]",str); 输入的字串只储存小写的英文字母到str中
        scanf("%[^a-z]",str);输入的字串除掉小写的英文字母后储存到str中