linux基础IO

回顾标准库IO接口

库函数接口一共有5个:fopen、fwrite、fread、fseek和fclose
1、fopen:FILE* fopen(const char *path,const char *mode)
参数说明:
path:要打开的文件路径名称(不带路径默认当前路径)
mode:打开方式(r,r+,w,w+,a,a+,b)。r:只读(文件不存在报错),r+:读写;w:只写(若文件存在清空内容,文件不存在则创建),w+(可读可写);a:追加只写(追加到文件末尾),a+(追加读写);b:对文件进行原始二进制操作。
返回值:
文件流指针–FILE*–>文件的操作句柄;如果打开失败返回NULL。
2、fwrite:size_t fwrite(const void *ptr,size_t size,size_t nmemb,FILE* stream)
参数说明:
ptr:要写入文件的数据
size:块大小
nmemb:块个数。(块大小块个数=总体写入长度)
注意:这里一般将块大小size设置为要写入文件的数据ptr的长度,块大小设置为1,这样的话如果返回值是1证明写入成功;返回值是0证明写入失败。
stream:fopen返回的操作句柄–>对应了要操作的文件
返回值:成功则返回实际写入文件的完整块个数。失败返回0。
3、fread:void *ptr,size_t size,size_t nmemb,FILE* stream)
参数说明:
ptr:读取到数据的保存空间,由ptr指针指向。
size:读取的大小。
nmemb:读取的块数。(块大小
块个数=总体读取长度)
注意:这里一般将读取的大小size设置为1,这样,返回值就是读取的字节大小。
返回值:成功则返回实际读取到的完整块的个数;错误返回0;读取到文件末尾返回0。这里有一个歧义,如果有的时候,读取字节的长度小于读取的大小size,也就是读取到的大小不到1块,但是已经读到了文件末尾,也会返回0,并不能证明它读取错误。所以,当返回值为0的时候,需要判断一下,究竟是读了不到完整的一块,但是读到了文件末尾了,还是读取错误了。 可以对返回值进行if语句判断,用feof来判断是否到达了文件末尾,ferror判断是否读取失败。
4、fseek:FILE* stream ,long offset,int whence)
参数说明:
stream:fopen返回的文件句柄。
offset:偏移量
whence:相对偏移起始位置。三个确定的值来设置(SEEK_SET-文件的起始位置,SEEK_CUR-文件的当前位置,SEEK_END-文件的末尾)。
返回值:成功返回0,失败返回-1。
5、fclose: int fclose(FILE *stream)
参数说明:open返回的文件流指针。
返回值:成功返回0,失败返回EOF。
用来释放fopen之后使用的资源,一个fopen操作之后后面必须跟一个fclose,并且必须一个不多一个不少。

系统调用接口

系统调用接口也有5个:open、write、read、lseek和close
1、open:int open (const char* pathname,int flags,mode_t mode)
参数说明:
pathname:要打开的文件的名称。
flags:打开方式---->>
必选项:O_RONLY只读()/O_WRONLY(只写)/O_RDWR(可读可写),这三个里面必须选择一个,有且只能选择一个。
可选项:O_CREAT:文件不存在则创建,存在则打开。O_EXCL:与O_CREAT一起使用,文件存在则报错,防止重复创建。O_TRUNC:打开文件的同时清空文件原有内容。O_APPEND:追加写。可选项与必选项之间可以用"|"连接。比如:O_WRONLY|O_CREAT|O_APPEND,就是追加写,文件不存在则创建的意思。
mode:创建权限–如果使用了O_CREAT则一定要加上这个权限–0777。
返回值:成功返回一个非负整数–操作句柄–文件描述符;失败返回1。
2、write:ssize_t write(int fd,const void* buf,size_t count)
参数说明:
fd:open返回的操作句柄–文件描述符。
buf:要写入文件的数据。
count:要写入文件数据的长度。
返回值:成功返回实际写入文件的数据长度;失败返回-1。
3、read:ssize_t read(int fd,void *buf,size_t count)
参数说明:
fd:open返回的操作句柄–文件描述符。
buf:一块空间缓冲区地址用于存放读取到的数据。
count:要读取文件数据的长度。
返回值:成功返回实际读取到的数据长度;失败返回-1。
4、lseek:off_t lseek(int fd,off_t offset,int whence)
参数说明:
fd:open返回的操作句柄–文件描述符。
offset:偏移量
whence:相对起始位置(SEEK_SET-文件起始位置,SEEK_CUR文件当前位置,SEEK_END-文件末尾位置)
返回值:成功返回跳转后位置相对于文件起始处的偏移量;失败返回-1。
5、closeint close(int fd)
参数说明:
fd:open返回的操作句柄–文件描述符
返回值:成功返回0,失败返回EOF。跟库函数接口一样,一个close跟一个open,并且是一一配对的。

文件描述符

1、什么是文件描述符?
文件描述符:非负整数–系统调用IO接口操作文件的句柄。
下面给张图来形象地理解一下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

2、文件描述符的分配规则
在这里插入图片描述可以看到,file *fd_array[]结构体的前三个分别指向了标准输入、标准输出和标准错误,这是一开始程序自动打开的,它们的文件描述符分别是0、1和2,也就是指针数组的前三个。此时再open一个abc.txt文件,那么它的文件描述符就在没有使用过的数组里面找一个下标最小的,就是3,所以abc.txt的文件描述符就是3。
上面说的就是最小未使用规则。
3、重定向
重定向原理:通过改变文件描述符对应位置的文件描述信息,进而改变所操作的文件,实现数据流向的改变。
看代码理解:
在这里插入图片描述在这里插入图片描述
编译运行之后发现并没有打印出来。

在这里插入图片描述
看一下myfile里面,原来是打印到这儿来了。
这是为什么呢?
答案:因为程序一开始关闭了标准输出,紧接着打开了一个myfile文件,由最小未使用的规则可知,此时myfile的文件描述符是1。而printf是将数据打印到标准输出文件,也就是1,但是现在1的指向已经变了,指向了myfile,所以数据就写到了myfile里面。

在这里插入图片描述注:使用dup2函数也可实现这种效果
dup2(old,new),让new成为old的拷贝,new就会指向old指向的文件了。
代码如下:
在这里插入图片描述

动态库、静态库的生成与使用

注意:库里面不能有main函数
一、生成
动态库和静态库生成的第一步都是:

gcc -fPIC -c **. c  -o   **.o//将源代码经过编译后生成机器指令

1、动态库的生成的第二步:

gcc  --shared  **.o  -o lib库名.so//将所有的机器指令打包到一起生成库文件

2、静态库的生成的第二步:

ar -cr lib库名.a **.o

二、使用
生成可执行程序时使用:使用gcc -l选项制定要链接的库名称,并且需要gcc能够找到这个文件:
(1).将库文件放到制定路径下:/lib64
(2).设置环境变量:export LIBRARY_PATH= $ LIBRARY_PATH: . /
(3).使用gcc -L选项指定库所在路径:gcc main.c -o main -L./ -ltestlib,运行可执行程序时使用。
运行可执行程序时使用:
(1).将库文件放到制定路径下:/lib64
(2).设置环境变量:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH: . /
(3)-L选项通常用于链接静态库–因为静态库没有运行依赖,通常是将一个静态库放到制定路径下

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值