Linux-文件IO

1.open函数

【1】基本概念和使用

#include <fcntl.h>

int open(const char *pathname,int flags);

int open(const char *pathname,int flags,mode_t mode);

功能:

打开或创建文件

参数:

@pathname //打开的文件名

@flags //操作的标志

//必选

O_RDONLY //只读

O_WRONLY //只写

O_RDWR //读写

//附加

O_APPEND //追加

O_CREAT //文件不存在 创建

O_TRUNC //文件存在 截短为0

@mode 一般不用

当flags中使用了 O_CREAT 时,需要指定 mode

mode 0777

0666

0444

返回值:

成功 文件描述符

失败 -1 && errno会被设置

注:创建文件并设置权限

【2】文件创建好后的权限:
a.指定的mode
b.umask (掩码) //二进制位 --- 遮住

最终文件的权限 = ~umask & mode

0 7 7 7
111 111 111 mode
0 000 000 010
111 111 101 ~umask

111 111 101
7 7 5

【3】fopen和open的相互转化

fopen open
r O_RDONLY
r+ O_RDWR

w O_WRONLY|O_CREAT|O_TRUNC
w+ O_RDWR|O_CREAT|O_TRUNC

a O_WRONLY|O_APPEND|O_CREAT
a+ O_RDWR |O_APPEND|O_CREAT

2.close
【1】基本概念

int close(int fd);
功能:
关闭文件描述符
以便 再次使用
参数:
@fd 要关闭的文件描述符
返回值:
成功 0
失败 -1

【2】文件描述符:

1.非负整型数值

2.分配原则

最小未使用

3.范围

0~1023

3.read函数

#include <unistd.h>

ssize_t read(int fd, void *buf, size_t count);

功能:

从fd中读数据 ,存到 buf中

参数:

@fd 要读取的文件

@buf 存放读取到的数据的 内存空间

@count 一次要读取的数量(字节)

返回值:

成功 表示成功读到的字节数

失败 -1 && errno

注:read实现cat

4.write函数

ssize_t write(int fd,const void *buf, size_t count);
功能:
把buf中 写到fd中
参数:
@fd 要写入的文件
@buf 存放数据的 内存空间
@count 一次要写入的数量(字节)
返回值:
成功 表示成功写入的字节数
失败 -1 && errno

注:屏幕读入,屏幕写出

注:read write实现cat

注:read write实现cp

5.lseek函数

off_t lseek(int fd, off_t offset, int whence);
功能:
重新定位文件偏移量
参数:
@fd 要定位的文件
@offset 偏移量
@whence 参考点
SEEK_SET //相对于文件开头的
offset >=0
SEEK_CUR //相对于当前位置
offset>=0
offset<0 //不能超过这个文件开头
SEEK_END //相对于文件末尾
offset < 0 //不能超过这个文件开头
offset >= 0 //可以 --- 创建 空洞 文件

返回值:
成功 从头的偏移量
失败 -1 && errno

lseek(fd,0,SEEK_SET); //定位到文件开头
lseek(fd,0,SEEK_END);

获得文件长度:
off_t len = lseek(fd,0,SEEK_END); //off_t <=> long int

注意:

1、不支持O_APPEND的追加模式,无法生成空洞文件。

2、lseek函数执行失败,文件指针还在偏移前的位置。

3、lseek函数在设备文件上偏移无效。 /dev/video0

4、fifo,socket 也不支持lseek的操作。

注:lseek创建空洞文件

6.fdopen函数

FILE *fdopen(int fd,const char *mode);

功能:

将fd 转换 成 FILE *

参数:

@fd 要操作fd

@mode 打开的模式

返回值:

成功 FILE *

失败 NULL

7.fileno函数

int fileno(FILE *stream);

功能:

将FILE *转换 为 fd

参数:

@stream 要转换流指针

返回值:

成功 fd

失败 - && errno

注:fdopen,fileno实现标准IO和文件IO转化

8.库函数和系统调用对比:
【1】库函数: //标准IO

优点:

a.方便,功能多

b.可移植性好

标准

不足:

c.可能存在 安全性 隐患

【2】系统调用:

优点:

a.使用起来,简单 ,功能简单

b.安全性高

c.设备文件 ---- 文件IO ///dev/video0 ----> fopen();

缺点:

c.很多复杂功能需要自己封装设计

d.可移植性差

【3】使用的选择:

标准IO --- 可移植性 如果操作只是文本数据

文件IO --- 安全性 操作的是硬件 ---文件IO

操作目录:
目录也是一种文件
类似 标准IO

9.opendir函数

DIR *opendir(const char *name);
功能:
打开目录,关联一个目录流
参数:
@name 要打开的目录名
返回值:
成功 返回DIR *
失败 NULL & errno

10.readdir函数

struct dirent *readdir(DIR *dirp);

功能:

读取目录项

参数:

@dirp 目录流指针

返回值:

成功 struct dirent *

失败 NULL && errno

struct dirent

{

ino_t d_ino; /* Inode number */

off_t d_off; /* Not an offset; see below */

unsigned short d_reclen;/* Length of this record */

unsigned char d_type;/* Type of file; not supported by all filesystem types */

char d_name[256]; /* Null-terminated filename */

}

注意:

读到文件末尾 NULL

注:readdir实现ls

注:reddir实现普通文件和目录的统计

11.closedir函数

int closedir(DIR *dirp);

功能:

关闭目录流

参数:

@dirp --- 目录流指针

返回值:

成功 0

失败 -1 &&errno

12.chdir函数

chdir ("/home/linux"); "../../"

fopen("1.mp4")

int chdir(const char *path);// /home/linux

功能:

改变当前程序的工作路径

参数:

path:改变到的路径

返回值:

成功 返回0

失败 返回-1

13.getcwd 函数

char *getcwd(char *buf, size_t size);

功能:

获得当前的工作路径

参数:

buf:保存工作路径空间的首地址

size:保存路径空间的长度

返回值:

成功返回包含路径空间的字符串首地址

失败返回NULL

注:getcwd获得当前路径,chdir切换路径(只能文件中更改,终端不需要更改)

14.mkdir 函数

int a =200;

int mkdir(const char *pathname, mode_t mode);//777 666 --x--x--x

功能:

创建一个目录

666-

参数:

pathname:路径

mode:

mode & ~umask 0002

返回值:

成功 返回0

失败 返回-1

注:创建目录文件

15.rmdir 函数

int rmdir(const char *pathname);

功能:

删除一个空目录文件

参数:

pathname:目录文件的名字

返回值:

成功 返回0

失败 返回-1

相关推荐
小梁不秃捏2 小时前
深入浅出Java虚拟机(JVM)核心原理
java·开发语言·jvm
我不是程序猿儿3 小时前
【C】识别一份嵌入式工程文件
c语言·开发语言
软件开发技术局4 小时前
撕碎QT面具(8):对控件采用自动增加函数(转到槽)的方式,发现函数不能被调用的解决方案
开发语言·qt
周杰伦fans5 小时前
C#中修饰符
开发语言·c#
yngsqq5 小时前
c# —— StringBuilder 类
java·开发语言
赔罪6 小时前
Python 高级特性-切片
开发语言·python
星星点点洲6 小时前
【操作幂等和数据一致性】保障业务在MySQL和COS对象存储的一致
java·mysql
xiaolingting6 小时前
JVM层面的JAVA类和实例(Klass-OOP)
java·jvm·oop·klass·instanceklass·class对象
风口上的猪20156 小时前
thingboard告警信息格式美化
java·服务器·前端
子豪-中国机器人7 小时前
2月17日c语言框架
c语言·开发语言