Day01 文件IO学习——标准IO与系统IO

目录

1 计算机的组成部分

1.1 硬件系统

1.2 软件系统

1.3 文件系统

2、Linux的文件类型

3、linux访问接口

3.1标准IO接口

 3.1.1 fopen——打开文件

 3.1.2 读取文件 

1、按字符读取--fgetc()

2、按行读取--fgets()

3、按块读取--fread()

4、 缓冲区--setbuf()--fflush()

3.1.3写入文件

3.1.4关闭文件

3.1.5 移动文件

3.1.6 格式访问

3.2系统IO接口

3.2.1 open

3.2.2 close

3.2.3 read

3.2.4 write

3.2.5位置偏移

3.2.6 ioctl--与驱动程序通信


1 计算机的组成部分

                                                硬件系统
                                                软件系统
                                                文件系统

1.1 硬件系统

                                                控制器
                                                运算器
                                                存储器
                                                输入设备

                                                输出设备

中央处理器(CPU)=控制器+运算器

CPU:计算机中对信息进行高速运算处理的主要部件

主机=CPU+主存储器

存储器:存储程序、数据和文件、一般由快速的内部存储器(内存条)和慢速的外部存储器(固态硬盘)组成

外设=输入设备+输出设备+辅助存储器

1.2 软件系统

系统软件计算机操作系统、硬件驱动系统
应用软件用户可以使用的用程序设计的应用程序

 

1.3 文件系统

文件系统是一种标准或者是一种格式

常见的文件系统有:FAT32、NTFS、ext4

2、Linux的文件类型

1普通文件-regular存在外部存储中,存储普通数据
2目录文件ddirectory存放目录项
3管道文件ppipe进程间通信,也称为命名管道FIFO
4套接字文件ssocket网络间通信
5链接文件llink间接访问另一个目标文件
6字符设备文件ccharacter字符设备在应用层的访问接口
7块设备文件bblock块设备在应用层的访问接口

3、linux访问接口

3.1标准IO接口

//头文件
#include <stdio.h>

//Linux系统下该头文件路径为
/usr/include

//标准IO函数
    fopen()
    fread()
    fwrite()
    fclose()
    fgetc()
    fputc()
    fgets()
    fputs()
    fprintf()
    fscanf()

 3.1.1 fopen——打开文件

//头文件
    #include <stdio.h>

//函数原型
    FILE *fopen(const char * pathname,const char * mode);
    FILE *fdopen(int fd,const char * mode);
     FILE *freopen(const char *pathname, const char *mode, FILE *stream);

//函数参数
(1)filename: 文件名字符串
(2)mode:文件属性
    r     O_RDONLY                        只读,要求文件必须存在
    r+    O_RDWR                          读写,要求文件必须存在
    w     O_WRONLY | O_CREAT | O_TRUNC    只写,如果不存在就创建新文件,如果存在就会将其内容清空
    w+    O_RDWR | O_CREAT | O_TRUNC      读写,如果不存在就创建新文件,如果存在就会将其内容清空
    a     O_WRONLY | O_CREAT | O_APPEND   只写,如果不存在就创建新文件,且文件偏移量被自动定位到文件末尾(追加方式)
    a+    O_RDWR | O_CREAT | O_APPEND     读写,如果不存在就创建新文件,且文件偏移量被自动定位到文件末尾(追加方式)

     wa      
     rb       
     wb       
     ab  
     

//函数返回值
    打开文件成功,返回指向目标文件的文件流指针
    打开文件失败,返回NULL

    每一个被fopen函数打开的文件都会得到一个文件流指针
    所以内核会为每一个被打开的文件都申请一块堆内存,用于存储文件的相关属性
    并且内核会把所有被打开的文件形成一条链表


 fseek(stream, 0, SEEK_END);

3.1.2 读取文件 

1、按字符读取--fgetc()
//头文件
#include <stdio.h>

//函数原型
//从打开的文件的文件流指针中读取一个字符
       int fgetc(FILE *stream);

       char *fgets(char *s, int size, FILE *stream);
       int getc(FILE *stream);

       int getchar(void);//只能从标准输入中获取一个字符---等价于getc()
       int ungetc(int c, FILE *stream);

//函数参数
    stream   待读取数据的文件指针,会把得到的字符转换为字符对应的ANSCII码
//函数返回值
    成功---读取到的字符
    失败---如果已经到达文件末尾,函数会发出EOF标志;出现读错误也会返回EOF

//说明
    标准库中提供了一个fgetc函数,通过C99标准可以知道该函数的作用是从文件指针stream指向的文件中读取一个字符,并在读取一个字节后把文件的光标位置向后移一个字节,然后把读取到的字符所对应的ASCII码通过返回值返回。

EOF是文件结束标志,其实是个宏定义,宏定义的值为 -1,在头文件libio.h中有相关描述。
#ifndef EOF
#define EOF (-1)
#endif
2、按行读取--fgets()
//头文件
#include <sys/ioctl.h>

//函数原型
//实际读取的字符数量为n-1,当遇到换行符或者遇到文件末尾结束

        char *fgets(char *s, int size, FILE *stream);
        char gets(char *s);

//函数参数
    s        自定义缓冲区指针---数据缓存区
    size     自定义缓冲区大小---准备读取的字符数量
    stream   要读取数据的文件指针
//函数返回值
    函数成功会返回    指向缓存区的指针
    函数失败会返回    NULL

//备注
    gets()缺省从文件stdin读取数据
    当返回NULL时,文件stream可能已达末尾,或者遇到错误
3、按块读取--fread()
//头文件
#include <stdio.h>

//函数原型
//从参数stream指向的文件中读取nmemb块数据,每块大小是size,并把读取的数据存储到ptr指向的缓存区中
size_t fread(void * restrict ptr,size_t size,size_t nmemb, FILE * restrict stream);

//函数参数
    ptr
        存储数据的缓存区(自定义缓冲区指针)
    nmemb
        向指定文件中读取数据的块数(数据块个数)
    size
        读取的数据块每块数据的大小(数据块大小)
    stream
        stream指向的文件(即将被读取数据的文件指针)
//函数返回值
    函数调用成功--返回读取的数据块的数量,
    函数调用失败--返回0  (小于nmmb或等于0)

函数返回值小于0,可能出现读取错误或者到达文件末尾,如何区分
标准库提供了两个函数接口feof()和ferror()来区分

//1、feof()
//头文件
    #include <stdio.h>
//函数原型
    int feof(FILE *stream);  //判断是否到达文件末尾
//返回值
    返回值是非0值,则说明已经到达文件末尾

//2、ferror()
//头文件
    #include <stdio.h>
//函数原型
    int ferror(FILE *stream);  //判断文件访问中是否出错
//返回值
    函数返回值是非0值表示出错
4、 缓冲区--setbuf()--fflush()
//头文件
    #include <stdio.h>
//函数原型
    void setbuf(FILE * restrict stream,char * restrict buf);
//函数参数
    stream
    buf
//函数返回值
    无返回值

手动刷新缓冲区
//头文件
    #include <stdio.h>
//函数原型
    int fflush(FILE *stream);
//函数参数
    stream
//函数返回值
    EOF
    0

#define _IOFBF 0      全缓冲
#define _IOLBF 1      行缓冲
#define _IONBF 2      无缓冲

对于标准输出stdout而言默认是采用行缓冲的
而对于标准出错stderr而言默认是采用无缓冲的
对于普通文件而言默认是采用全缓冲的。

3.1.3写入文件

1、字符写入

(1)function:将一个字符写入指定文件中
(2)头文件:#include <stdio.h>
(3)函数原型
         int fputc(int c,FILE *stream);
         int putc(int c,FILE *stream);
         int putchar(int c);
(4)函数参数
        c       要写入的字符
        stream  要写入的文件指针
(5)函数返回值
        成功    写入到的字符
        失败    EOF

2、按行写入

(1)function:将数据写入指定文件中
(2)头文件:#include <sys/ioctl.h>
(3)函数原型
         int fputs(const char *s,FILE *stream);
         int puts(const char *s,FILE *stream);
         
(4)函数参数
        s       自定义缓冲区指针
        stream  要写入数据的文件指针
(5)函数返回值
        成功    非负整数
        失败    EOF

3、按块写入

(1)function:将数据写入指定文件中
(2)头文件:#include <sys/ioctl.h>
(3)函数原型
        size_t fwrite(const char *ptr,size_t size,size_t nmemb,FILE *stream);
  
         
(4)函数参数
        ptr       自定义缓冲区指针
        size      数据块大小
        nmemb     数据块个数
        stream    要写入数据的文件指针
(5)函数返回值
        成功    写入的数据块个数,等于sinmembze
        失败    写入的数据块个数,小于nmemb或等于0

3.1.4关闭文件

(1)function:关闭文件
(2)头文件:#include <stdio.h>
(3)函数原型
         int fclose(FILE *stream);
         
(4)函数参数
        stream  要关闭的文件
(5)函数返回值
        成功   0
        失败   EOF

3.1.5 移动文件

1、设置位移
//(1)note
    每个打开文件的结构体中都有一个位置指示器
    位置指示器是文件光标;被打开的文件的光标默认是在文件开头的
//(2)头文件
    #include <stdio.h>
//(3)函数原型
    int fseek(FILE *stream,long int offset,int whence);
//(4)参数
    stream    要操作的文件指针
    offset    偏移量
    whence    光标位置
/(5)返回值
    成功    返回0


2、获取位移
//(1)note
   获取指定文件的位置指示器的当前值
//(2)头文件
    #include <stdio.h>
//(3)函数原型
    long int ftell(FILE *stream);
//(4)参数
    stream    要操作的文件指针
//(5)返回值
    成功    返回文件的位置指示器的当前值

3.1.6 格式访问

1、fprintf()
//常用的格式化函数:printf、fprintf、scanf、fscanf、sprintf、snprintf
//格式化字符串输出到某个文本
//(1)头文件
    #include <stdio.h>
//(2)函数原型
    int fprintf(FILE *restricet stream,const char *restrict format,.....);
//(3)函数参数
    stream

//(4)函数返回值
    成功    返回字符数量


2、sprintf()
//格式化字符串输出到某个文本
//(1)头文件
    #include <stdio.h>
//(2)函数原型
    int sprintf(char *restricet s,const char *restrict format,.....);
//(3)函数参数
    s 数组或者堆内存

//(4)函数返回值
    成功    返回字符数量



    
    

3.2系统IO接口

3.2.1 open

//头文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

//函数原型
int open(const char *pathname,int flags);
int open(const char *pathname,int flags,mode_t mode);
int open(const char *pathname,mode_t mode);

//函数参数
(1)pathname--要打开的文件的路径,字符串常量
(2)flags
              O_RDWR-----可读可写
              O_RDONLY---只读
              O_WRONLY---只写
         追加模式----用位或(|)与上面的三个进行组合
              O_APPEND
              O_ASYNC
              O_CLOEXEC
              O_CREAT---如果文件不存在就创建
(3)mode---创建文件权限、且文件权限是八进制的,只有在创建文件的时候才可以使用
    r-读
    w-写
    x-执行
    

//函数返回值
    函数成功返回文件的描述符
    函数失败返回-1

文件权限

3.2.2 close

//头文件
#include <unistd.h>

//函数原型
int close(int fd);

//函数参数
fd --- 关闭的文件描述符

//函数返回值
    函数成功返回0
    函数失败返回-1

3.2.3 read

//功能
从fd对应的文件中读取最多count个字节的数据并存储到buf指向的缓冲区中

//头文件
#include <unistd.h>

//函数原型
ssize_t read(int fd,void *buf,size_t count);

//函数参数
fd --- 需要读取的文件
buf---存储读取到的数据的缓冲区
count--读取数据的最大字节数

//函数返回值
    返回值是读取的字节数量    
    如果返回值为0,说明读取到文件末尾
    如果返回值是-1,则读取出错

3.2.4 write

//功能
将buf指向的缓冲区中的数据写入到fd对应的文件中,最多写入count个字节的数据

//头文件
#include <unistd.h>

//函数原型
ssize_t write(int fd,void *buf,size_t count);

//函数参数
fd --- 写入到的文件
buf---存储数据的缓冲区
count--需要写入数据的最大字节数

//函数返回值
    返回值是写入的字节数量    
    如果返回值是-1,则写入出错

3.2.5位置偏移

//功能
设置文件的位置指示器的位移

//头文件
#include <unistd.h>
#include <sys/types.h>

//函数原型
off_t lseek(int fd,off_t offset,int whence);

//函数参数
fd ----- 文件名
offset---移动位数
whence---参考位置
        SEEK_SET---文件开头
        SEEK_CUR---当前位置
        SEEK_END---文件末尾

//函数返回值
    成功返回文件位置指示器相对于文件开头的偏移量
    失败返回-1

3.2.6 ioctl--与驱动程序通信

//头文件
    #include <sys/ioctl.h>
//函数原型
    int ioctl(int fd, unsigned long request, ...);
    //...表示变参,后面这个参数根据request来决定
//参数
    int fd设备文件描述符
    unsigned long request 请求命令  FBIOGET_VSCREENINFO
    ...与请求命令对应的参数 struct fb_var_screeninfo

//返回值
    成功0
    失败-1
      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

凉辰梦凡星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值