文件IO



1. 打开或关闭一个IO流
    NAME
       fopen, - stream open functions

    SYNOPSIS
       #include <stdio.h>

    在标准IO库中,用结构体FILE来表示一个已经打开的文件流
    fopen是用来打开一个文件流

       FILE *fopen(const char *path, const char *mode);
           path:要打开的文件的名字(带路径), 普通文件(文本文件,二进制文件)
           mode: 打开文件的方式,有如下几种:
               "r" : read, 只读打开。文件不存在,则报错,打开后光标在开头。
               "r+": 读写打开。文件不存在,则报错,打开后光标在开头。

               "w": write, 只写打开。文件不存在,则创建。打开后,文件截短(清零)
               "w+": 读写打开。文件不存在,则创建,打开后,文件截短(清零)

            "a" :append 追加打开。文件不存在,则创建。打开后,光标末尾。
                    追加:从后面开始写。
            "a+": 读写打开,文件不存在,则创建。原始读位置在开头,
                    原始写位置在末尾。

        返回值:
            如果成功则返回FILE*指针
            如果失败返回    NULL, errno被设置。
                    errno是一个全局变量,表示出错码。

        RETURN VALUE
          Upon successful completion fopen(), fdopen()  and  freopen()  return  a
          FILE pointer.  Otherwise, NULL is returned and errno is set to indicate
          the error.


    NAME
       fclose - close a stream

    SYNOPSIS
       #include <stdio.h>

        fclose用来关闭一个文件流
       int fclose(FILE *fp);
           fp:要关闭的文件流。fopen返回值
           返回值:
            RETURN VALUE
                Upon  successful  completion 0 is returned.  Otherwise, EOF is returned
               and errno is set to indicate the error.  In  either  case  any  further
               access  (including  another  call to fclose()) to the stream results in
               undefined behavior.  

               如果成功返回0,
               如果失败返回-1, errno被设置


2. 读写一个流
    2.1 一个字符的读写
        fgetc/getc/getchar       
    NAME
           fgetc, getc, getchar, - input of characters  
    SYNOPSIS
           #include <stdio.h>
            
            fgetc用来从stream指定的文件流中,读取下一个字符,并
            返回.
           int fgetc(FILE *stream);
                   stream:FILE*指针,表示要从哪个文件流中读字符
               返回值:
                   如果成功,返回读取到的字符的ASCII码。
                   如果失败返回EOF(-1), errno被设置。

            getc功能及返回值与fgetc一样。但是,getc它可能是用
            宏来实现的.
           int getc(FILE *stream);


            getchar() <=> fgetc(stdin)
            getchar()用来从标准输入设备(stdin)中获取一个字符
           int getchar(void);

    
            返回值:
                如果成功返回,获取到的字符的ASCII码(>=0)
                    如果读取成功,光标会自动加1
                如果失败返回-1, errno被设置
        ====
        NAME
               fputc,    putc,  putchar output of characters

        SYNOPSIS
           #include <stdio.h>

               fputc用来把字符c写到stream指向的文件流中去
           int fputc(int c, FILE *stream);

             putc功能及返回值与fputc一样,只不过putc它可能是
             用宏来实现的。
           int putc(int c, FILE *stream);

            putchar(c) <=> fputc(c, stdout)
            putchar用来把字符c写到标准输出设备上去。
           int putchar(int c);

            返回值:
                如果成功,返回写到文件流中去的字符的ASCII码
                    光标位置会自动加1
                如果失败返回EOF(-1), errno被设置



        练习:
            用标准IO函数,来实现一个普通文件的拷贝操作。
            ./fops   1.txt  2.txt

    2.2 一次一行的读写
        fgets/gets
        fputs/puts



    NAME
      fgets/gets :用来从文件流中读取一行字符

    SYNOPSIS
       #include <stdio.h>


            fgets用来从stream指定的文件流读取一串字符到
            s指向的内存中,但是至多读取size -1个字符
       char *fgets(char *s, int size, FILE *stream);
               s:指针,指向的内存用来保存读取到的字符串
               size: 一般为s指向的内存空间的大小
               stream:文件流指针,表示要从哪个文件流读取

            fgets从stream中读取字符时,有三种情况可以让它停止读入:
            (1) 已经读取size -1 个字符了
            (2) 遇到\n
            (3) 遇到文件结束了
        返回值:
            如果成功,返回保存字符串的首地址
            如果失败,返回NULL, errno被设置
        

        gets用来从标准输入设备(一般为键盘)上获取一串字符
        到s指向的内存.
       char *gets(char *s);
           gets有一个巨大的bug (you know de)
           以后就不用gets,
           fgets(s, size, stdin);
        
    ===
    NAME
              fputs/puts
    SYNOPSIS
           #include <stdio.h>

            fputs用来把s指向的字符串(以'\0'结束)写入到
                stream指定的文件流中去
           int fputs(const char *s, FILE *stream);
           int puts(const char *s); <=> fputs(s, stdout);

        返回值:
            puts() and fputs()  return  a  nonnegative    (非负) number on success, or EOF on error.
            如果成功返回一个非负数(>=0)
            如果失败返回EOF(-1), errno被设置
    2.3 二进制读写(直接读写).每次读写n 个对象,每个对象有相同的长度
        "数组读写"

    NAME
           fread, fwrite - binary stream input/output

    SYNOPSIS
           #include <stdio.h>
                   
            fread用来从stream指定文件流中读取n个对象(每个对象size字节长度)
            到ptr指向的内存空间。
        
           size_t fread(void *ptr, size_t size, size_t n, FILE *stream);


            fwrite用来把ptr指向的n个对象(每个对象size字节)写到stream指定的
            文件流中去.
            
           size_t fwrite(const void *ptr, size_t size, size_t n,       FILE *stream);


                On  success,  fread()  and  fwrite() return the number of items
               read or written.  

        返回值:
            如果成功,fread返回成功读到的对象个数
                            fwrite返回成功写入的对象个数
            fread的返回值有可能小于n
            fwrite的返回值也有可能小于n

             如果出错,返回负数(EOF,-1)
3. fflush
    int fflush(FILE *stream);

    对输出流,把写缓冲区的内容写/更新到文件中去;
    对输入流,把读缓冲区的内容直接discard(丢弃)

    stream == NULL,
    fflush(NULL); 则 fflush把该进程所有打开的文件流都fflush

4.  定位流
    fseek/ftell/rewind/fgetpos/fsetpos
    
    NAME
       fgetpos, fseek, fsetpos, ftell, rewind - reposition a stream

SYNOPSIS
       #include <stdio.h>

        fseek用来把stream指定的文件流的光标定位到
        offset处(offset可以相对于文件开头,也可以是相对于
        文件当前光标位置,也可以相对于文件结尾)
       int fseek(FILE *stream, long offset, int whence);
        stream: 要定位的文件流
        offset:偏移量,具体的含义需要结合第三个参数
            可正可负,
                当whence == SEEK_SET时,offset一般不为负数
        whence: 定准的方式,有如下三种:
            SEEK_SET: 相对于文件开头定位。
            SEEK_CUR:current,相对于文件当前光标位置定位
            SEEK_END:  end,相对于文件末尾定位
          返回值:
               成功返回0,
                 失败返回-1, errno被设置

          
       
        得到文件当前光标离文件开头的偏移量 (以字节为单位)
       long ftell(FILE *stream);

           例子:求一个文件的长度
               fseek(fp, 0, SEEK_END);
               int size = ftell(fp);
           
        rewind用来把stream指定的文件流光标定位在开头。
       void rewind(FILE *stream); <=> fseek(stream, 0L, SEEK_SET);

       

     fpos_t这个结构体用来保存新的光标位置的
    fgetpos fsetpos 的定位光标的方式都是采用SEEK_SET(从头开始定位)

    typedef struct
    {
      __off_t __pos;  //偏移量
      __mbstate_t __state;
    } _G_fpos_t;
    typedef _G_fpos_t fpos_t;

    
       int fgetpos(FILE *stream, fpos_t *pos);
       int fsetpos(FILE *stream, fpos_t *pos);

           例子:把一个文件定位在离开头50个字节处
               fpos_t t;
               t.__pos = 50;
           fsetpos(stream, &t);

               fpos_t a;
           fgetpos(stream, &a);
               =>a.__pos
       
5. 文件出错/文件结束
    NAME
       clearerr, feof, ferror, fileno - check and reset stream status

    SYNOPSIS
       #include <stdio.h>

        clearerr用来清除文件出错标记
       void clearerr(FILE *stream);


        eof : end of file
        feof用来判断stream指定的文件流光标是否达到文件末尾。
       int feof(FILE *stream);
           返回非0(true)值,表示文件已经达到末尾
           否则,还没有到末尾

        ferror用来判断 stream 指定的文件流是否出错了。
       int ferror(FILE *stream);

6 .格式化IO

6.1   格式化输出  printf/fprintf/sprintf/snprintf

    NAME
           printf,   fprintf,   sprintf,   snprintf,   - formatted output conversion

    SYNOPSIS
           #include <stdio.h>

            printf用来格式化输出对象的值的
            输出到哪里呢?
                stdout
           int printf(const char *format, ...);
               printf可以接多个参数(至少一个),但这么多参数,
               我们可以把它分为两类:第一个参数为一类,其余的
               为第二类

                  第一个参数: 格式化字符串。格式化字符串的意思是说,
                  你得按我的指示去输出。在格式化字符串中有两类字符:
                      普通字符,和格式化字符
                          普通字符: abc00,..., 按原样输出
                              \n\t\f\r ...
                          格式化字符: 不按原样输出,因为它有特殊的含义。
                              %d: 指定后面对应的变量按十进制整数输出
                              %c: 按字符形状输出
                                  printf("%c", 97);
                              %f:
                              %e:
                              %g: 按%f和%e中较短的输出,不输出无意义的0
                              %s:
                              %p
                              %m.nd
                              %m.nf
                              ...
                      
            其他参数:要输出的变量列表

                返回值:
                     成功返回实际打印的字符个数
                     失败返回-1, errno被设置


               fprintf与printf功能与返回值类似,只不过 fprintf
               是格式化输出到指定的文件流中。
               printf() <=> fprintf(stdout, ...)
           int fprintf(FILE *stream, const char *format, ...);

               sprintf与printf功能与返回值类似,只不过sprintf
               是格式化输出到指定的内存空间(str指定的)
               但是 sprintf有一个bug . (什么bug ?str没的指定长度,当
               实际输出的字符串,大于 str的长度时,就会有
               bug, 内存溢出)
           int sprintf(char *str, const char *format, ...);


               snprintf是为了解决sprintf的bug才出现的
           int snprintf(char *str, size_t size, const char *format, ...);

6.2 格式化输入
    NAME
       scanf,  fscanf, sscanf, - input format        conversion

    SYNOPSIS
       #include <stdio.h>

        scanf是用来格式化输入 ,它可以接多个参数,
        但参数分为两类:
            第一个参数:格式化输入字符串,就是告诉你
            怎么输入的,这个里面存在两类字符:
                普通字符:
                    按原样输入

                格式化字符: 不按原样输入,因为它有特殊的含义。
                    %d: 十进制数字字符串
                    %f:  十进制实数字符串
                    %s: 任意字符串
                    %c:
                    ....
            其他参数:  地址列表

        scanf结束有几种情况:
            (1) 遇到非法字符了
            (2) \n
            (3) 该输入的都输入了

        返回值:
            如果成功,返回成功匹配并赋值的变量个数
            失败,返回-1, errno被设置。

                
       int scanf(const char *format, ...);

           fscanf 与scnaf功能与返回类似,只不过fscanf是从指定的文件流
           获取变量。
           
       int fscanf(FILE *stream, const char *format, ...);


           sscanf与scanf功能与返回值类似,只不过sscanf是从指定的内存
           字符串中获取变量。
       int sscanf(const char *str, const char *format, ...);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值