标准IO函数&缓冲区

目录

标准IO函数

1.fopen

2.perror

3.fclose

4.fprintf

5.fscanf

 6.fputc

7.fgetc

8.fputs

9.fgets

 10.fwrite

 11.fread

12.fseek

 13.ftell

缓冲区

 全缓冲

 刷新条件: 

行缓冲

刷新条件:

无缓冲

刷新条件:


标准IO函数

1.fopen

功能:打开一个文件;
原型:
       #include <stdio.h>

       FILE *fopen(const char *pathname, const char *mode);
参数:
    char *pathname:指定要打开的文件路径以及名字;
    char *mode:以什么方式打开文件;
        r     以读的方式打开文件; 流在文件开头位置---》若要读取文件,则从开头开始读取
                若文件不存在,打开失败。

       r+     以读写的方式打开文件; 流在文件开头位置---》若要读写取文件,则从开头开始操作
                若文件不存在,打开失败.

       w      以写的方式打开文件,---》若要写取文件,则从开头开始操作
               若文件不存在,则会创建文件,并打开;
               若文件存在,则清空文件,并打开; 

       w+     以读写的方式打开文件,---》若要读写取文件,则从开头开始操作
               若文件不存在,则会创建文件,并打开;
               若文件存在,则清空文件,并打开; 

       a      以写的方式打开文件,---》若要写取文件,则从结尾开始操作
               若文件不存在,则会创建文件,并打开;
               若文件存在,则文件的流在文件结尾,不清空;

       a+     以读写方式打开文件,
                若文件不存在,则会创建文件,并打开;
                若文件存在,则流的初始位置:
                 1. 若开始是读文件,则流在文件开头
                 2. 若开始是写文件,则流在文件结尾。
返回值:
    成功,返回FILE *类型指针;
    失败,返回NULL,同时更新errno;     
     
    errno:本质上是一个整型数,不同的错误会更新不同的errno;    定义在errno.h这个头文件中
    所有情况:/usr/include/asm-generic   errno.h  errno-base.h
  

2.perror

功能:根据errno,打印对应的错误信息;
原型:
       #include <stdio.h>

       void perror(const char *s);
参数:
    char *s:用于提示的字符串;

3.fclose

功能:关闭指定的文件; 释放资源,例如缓冲区空间。若不关闭,则可能会造成内存泄漏;
原型:
       #include <stdio.h>

       int fclose(FILE *stream);
参数:
    FILE *stream:指定要关闭的文件对应的流指针;
返回值:
    成功,返回0;
    失败,返回EOF,同时更新errno; # define EOF (-1) 

4.fprintf

功能:将数据格式化输出到指定文件中;
原型:
       #include <stdio.h>

       int printf(const char *format, ...);     printf("hello world %d %c %f \r\n\t", 1, 'a', 10.1)
       int fprintf(FILE *stream, const char *format, ...);
参数:
    FILE *stream:流指针,指定要输出到哪个文件中,就填对应文件的流指针;
    char *format:格式化字符串:字符,占位符,转义字符;
    ...:不定参数,不定数据个数,不定数据类型。
返回值:
    成功,返回被打印的字符个数;
    失败,返回负数,

5.fscanf

功能:从指定文件中格式化读取数据; scanf fscanf的%s %d默认不识别空格,\n, \t     
        %c形式获取单个字符会识别空格,换行。
原型:
       #include <stdio.h>

       int scanf(const char *format, ...);
       int fscanf(FILE *stream, const char *format, ...);
参数:
    FILE *stream:流指针,从哪个文件中读取,填对应的流指针;
    char *format:格式化字符串:字符,占位符,转义字符;
    ...:不定参数,不定数据个数,不定数据类型。
返回值:
    成功,返回成功读取的数据个数;
    =EOF,文件读取完毕
    =EOF,函数运行失败,同时更新errno;

 6.fputc

功能:将单个字符打印到指定的文件中;
原型:
       #include <stdio.h>

       int fputc(int c, FILE *stream);

       int putchar(int c);     putchar('a'); putchar(97); putchar(10); putchar('\n');
参数:           
    int c:指定要输出的字符对应的字符形式或者整型形式,填'a', 也可以填97;
    FILE *stream:流指针,想要打印到哪个文件中就填哪个文件对应的流指针;
返回值:
    成功,返回成功输出字符对应的整型形式;
    失败,返回EOF;

Linux操作系统,默认以\n结尾,若用编辑器保存检测到没有以\n结尾,则会自动补充'\n'

unix操作系统,默认以\r\n结尾,

windows操作系统,默认以\r结尾。

7.fgetc

功能:从指定文件中读取单个字符;
原型:
       #include <stdio.h>

       int fgetc(FILE *stream);
参数:
    FILE *stream:指定要从哪个文件中读取;
返回值:
    成功,返回成功读取到的字符对应的整型形式;
    当文件读取完毕或者函数运行失败,返回EOF;

8.fputs

功能:将字符串输出到指定的文件中; fputs不会自动补充\n
原型:
       #include <stdio.h>


       int fputs(const char *s, FILE *stream);

       int puts(const char *s);     char str[20] = "hello";  puts(str);
参数:
    char *s:指定要输出的字符串的首地址;       
    FILE *stream:流指针;
返回值:
    成功,返回非负数>=0;
    失败,返回EOF;

9.fgets

功能:从指定文件中获取字符串;
     1.最多获取size-1个字节,因为fgets函数在停止读取后,后自动在有效字符的最后一个字节补上\0
     2.会获取空格;会获取\n字符
     3.遇到\n字符后停止读取,且会获取\n字符;
原型:
       #include <stdio.h>

       char *fgets(char *s, int size, FILE *stream);
参数:
    char *s:存储获取到的字符串;
    int size:size-1
    FILE *stream:流指针;
返回值:
    成功,返回存储数据空间的首地址;
    失败,返回NULL;
    当读取到文件结尾,且没有任何数据被读取出来,返回NULL;

在文件中有如下数据:123456789, char str[9];   ___A  D___
    fgets(str, 10, fp);
    printf("str=%s", str);
A. 123456789  B.123456789乱码  C.12345678  D.段错误

 10.fwrite

功能:将数据的二进制形式写入到指定的文件中;
      二进制形式--》将数据拆分成一个一个的字节并转换成字符形式写入文件中
原型:
       #include <stdio.h>

  
       size_t fwrite(const void *ptr, size_t size, size_t nmemb,
 FILE *stream);
参数:
    void *ptr:指定要输出的数据的首地址,是void*类型,代表任意类型,所以可以输出任意类型数据;
                例如字符串char*  整型数组int*  构造类型
    size_t size:每个数据所占的字节数大小;例如:
            要输出的数据为int类型,则size==4
            要输出的数据为short类型,则size==2
            要输出的数据为char类型,则size==1
            要输出的数据为构造类型,则size==sizeof(struct 结构体名);
    size_t nmemb:指定要输出的数据个数,注意是个数,不是字节数
        总大小为size*nmemb; 具体以什么作为整体无所谓,只要输出的结果总大小相同即可;
    FILE *stream:流指针;
返回值:
    成功,返回成功输出的数据个数,即nmemb;
    失败, =0或者<nmemb

 11.fread

功能:将数据的二进制形式从指定文件中读取出来,转换成对应的数据;
原型:
       #include <stdio.h>

       size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
参数:
    void *ptr:指定要将数据存储到什么位置,填对应位置的首地址。void*类型;
    size_t size:每个数据所占的字节数大小;例如:
            要输出的数据为int类型,则size==4
            要输出的数据为short类型,则size==2
            要输出的数据为char类型,则size==1
            要输出的数据为构造类型,则size==sizeof(struct 结构体名);
    size_t nmemb:指定要读取的数据个数,注意是个数,不是字节数
        总大小为size*nmemb; 具体以什么作为整体无所谓,只要输出的结果总大小相同即可;
    FILE *stream:流指针;
返回值:
    成功,返回成功读取的数据个数,即nmemb;
    失败或者读取到文件结尾的时候, =0或者<nmemb

12.fseek

功能:修改文件偏移量,到指定位置;
原型:
       #include <stdio.h>

       int fseek(FILE *stream, long offset, int whence);
参数:
    FILE *stream:指定要修改哪个文件的偏移量;
    long offset: 距离whence参数指定的偏移量。往前偏移填负数, 往后偏移填正数
    int whence:
       SEEK_SET,  文件开头位置
       SEEK_CUR,  文件当前位置
       SEEK_END   文件结尾位置
返回值:
    成功,返回0;
    失败,返回-1,更新errno;
    
    //修改偏移量到文件开头
    int res = fseek(fp, 0, SEEK_SET);   
    
  将文件偏移量修改到开头:
       void rewind(FILE *stream); ----》等价于 fseek(fp, 0, SEEK_SET); 

 13.ftell

功能:获取文件当前位置距离文件开头的偏移量;
原型:
       #include <stdio.h>


       long ftell(FILE *stream);
返回值:
    成功,返回文件当前位置距离文件开头的偏移量;
    失败,返回-1,更新errno;
    
将文件偏移量修改到结尾,获取文件偏移量的值,就是文件大小。    
    fseek(fp, 0, SEEK_END);
    long size = ftell(fp);

时间相关函数 

​​​​​​​time

功能:从1970-1-1日至今的秒数;
原型:
       #include <time.h>

       time_t time(time_t *tloc);
参数:
    time_t *tloc:若不为空,则1970-1-1日至今的秒数同样会被存储到该指针指向的内存空间中;
返回值:
    成功,返回1970-1-1日至今的秒数;
    失败,返回((time_t) -1),更新errno;

    time_t t = time(NULL);  
    printf("%ld\n", t);

    time_t pt;                     
    time(&pt);
    printf("%ld\n", pt);

 localtime

目录

标准IO函数

1.fopen

2.perror

3.fclose

4.fprintf

5.fscanf

 6.fputc

7.fgetc

8.fputs

9.fgets

 10.fwrite

 11.fread

12.fseek

 13.ftell

时间相关函数 

​​​​​​​time

 localtime

缓冲区

 全缓冲

 刷新条件: 

行缓冲

刷新条件:

无缓冲

刷新条件:


缓冲区

1.只有标准IO才有缓冲区,所有的数据都先放在缓冲区中,缓冲区满或者满足一定条件后刷新缓冲区。
2.在实际生活生产过程中,我们的代码会运行在死循环中,导致缓冲区可能不满且程序没有退出。所以必须要掌握缓冲区的刷新条件。

 全缓冲

操作对象:手动用fopen打开文件后,创建的缓冲区都是全缓冲。用FILE*类型流指针进行维护。
大小:4096bytes = 4k

 刷新条件: 


1.缓冲区满 (要多写一个后才能刷新前4096个)

     //由于编译器优化,只打开不操作,此时不会真正申请缓冲区。
     fputc('a', fp);
     printf("%ld\n", fp->_IO_buf_end - fp->_IO_buf_base );


2.fflush函数,强制刷新输出流缓冲区

       #include <stdio.h>

       int fflush(FILE *stream);


3.关闭流指针   fclose
4.主函数调用return
5.调用exit函数退出程序


原型:
       #include <stdlib.h>

       void exit(int status);
参数:
    int status:目前随便填一个int类型整数即可,例如 1 2 0


6.输入输出转换。

行缓冲

操作对象:标准输入流指针(FILE* stdin)   标准输出流指针(FILE* stdout)
大小:1024bytes = 1k

printf("size=%ld\n", stdout->_IO_buf_end - stdout->_IO_buf_base);

刷新条件:

1.缓冲区满 (要多写一个后才能刷新前1024个)
2.fflush函数,强制刷新输出流缓冲区

printf("size=%ld\n", stdout->_IO_buf_end - stdout->_IO_buf_base);


3.关闭流指针   fclose
4.主函数调用return
5.调用exit函数退出程序

功能:目前只要理解能退出程序即可;
原型:
       #include <stdlib.h>

       void exit(int status);
参数:
    int status:目前随便填一个int类型整数即可,例如 1 2 0


6.遇到\n字符
7.输入输出转换。

无缓冲

操作对象:标准错误输出流指针(FILE* stderr)   -->perror函数默认分装的就是stderr流指针。
大小为:1bytes,且只要往里放数据,就会直接将数据刷新出来。

刷新条件:

无 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ck钉钉钉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值