Linux软件应用编程 第一章中:Linux文件操作

6.文件IO

文件IO: Linux内核提供的文件操作接口。属于系统调用。
学习接口:

  1. 打开文件 : open()
  2. 读文件、写文件 : read() 、write()
  3. 关闭文件 : close()
    函数接口:

①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);
功能:打开一个文件并获得一个文件描述符
参数:
pathname:要打开的文件的文件名
flags:打开方式
O_RDONLY :只读
O_WRONLY :只写
O_RDWR :读写
O_CREAT :创建
O_TRUNC : 清空
O_APPEND : 追加
"r" O_RDONLY
"r+" O_RDWR
"w" O_WRONLY | O_TRUNC | O_CREAT, 0664
"w+" O_RDWR | O_TRUNC | O_CREAT,0664
"a" O_WRONLY | O_CREAT | O_APPEND, 0664
"a+" O_RDWR | O_CREAT | O_APPEND, 0664
mode:用户自己、同组用户、其他用户对该文件的读写执行权限
(mode & ~umask)
普通文件:0664
权限给满:0777
rwxrwxr-x
返回值:
成功:文件描述符
失败:-1
=>文件描述符:
当打开一个文件时,系统会为已打开的文件分配一个文件描述符用来标记该文件。
=>文件描述符:小的,非负的整形数据
=>操作系统默认可分配出的文件描述符:0-1023: 总共1024个
=>文件描述符的分配原则:最小未被使用
=>系统默认已打开的文件:
标准IO: 文件IO
FILE * int
stdin 0(STDIN_FILENO)
stdout 1(STDOUT_FILENO)
stderr 2 (STDERR_FILENO)

②close

#include <unistd.h>
int close(int fd);
功能:关闭文件
参数:
fd:文件描述符
返回值:
成功:0
失败:-1
注意: 只打开文件,使用完不关闭文件会造成文件描述符泄露。

③write

ssize_t write(int fd, const void *buf, size_t count);
功能:向文件中写入数据
参数:
fd :要写入的文件描述符
buf:要写入的数据首地址
count:希望写入的字节数
返回值:
成功:实际写入的字节数
失败:-1

④read

ssize_t read(int fd, void *buf, size_t count);
功能:从文件中读取数据
参数:
fd:要读的文件的文件描述符
buf:存储读取数据的空间首地址
count:希望读到的字节数
返回值:
成功:返回实际读到的字节数
失败:-1
到达文件文件末尾:0

⑤文件定位函数 lseek()

off_t lseek(int fd, off_t offset, int whence);
功能:重新定位文件的读写位置
参数:
fd:文件描述符
offset:偏移量
whence:要偏移的起始位置
SEEK_SET :从文件开头偏移
SEEK_CUR: 从当前读写位置偏移
SEEK_END :从文件末尾偏移
返回值:
成功:返回当前读写位置到文件开头的偏移量
失败:-1

7 .文件IO和标准IO****的区别

1)缓冲区

①行缓冲

默认大小1024字节(1K),主要使用在人机交互终端上。
=>刷新条件:
遇到'\n'刷新
程序结束刷新
使用fflush()强制刷新
缓冲区满时自动刷新

②全缓冲

默认大小4096字节(4K),文件交互
=>刷新条件:
程序结束刷新
文件关闭自动刷新
全缓冲区满时自动刷新
使用fflush()强制刷新

③无缓冲

0k, 出错信息输出,标准出错设备
stderr

8.目录IO

打开目录文件:opendir()
读目录文件 :readdir()
关闭目录文件 : closedir()

①opendir

DIR *opendir(const char *name);
功能:打开目录文件并获得目录流指针
参数:
name:目录名
返回值:
成功:目录流指针
失败:NULL

②closedir

int closedir(DIR *dirp);
功能:关闭目录文件
参数:
dirp:目录流指针
返回值:
成功: 0
失败:-1

③readdir

struct dirent *readdir(DIR *dirp);
功能:从目录流中读取数据
参数:
dirp:目录流指针
返回值:
成功:struct dirent 指针,代表读到的文件信息
失败:NULL
文件末尾:NULL
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_name256; /* Null-terminated filename */
};

④mkdir

mkdir:创建文件夹
touch:创建普通文件
open();
fopen();
mkdir();
int mkdir(const char *pathname, mode_t mode);
功能:创建一个目录文件(文件夹)
参数:
pathname:目录名称
mode:目录文件的操作权限
返回值:
成功:0
失败:-1
【例】实现cp


相关推荐
bosins6 小时前
彻底解决 WSL 2.7+ 空闲自动关闭/内存回收导致 Docker 中断的问题
linux·docker·wsl·dashboard
LongRunning6 小时前
【Linux】H3网络(二)
linux
国际云,接待7 小时前
华为云 EVS 性能诊断:用 CES、ECS QoS 与 fio 定位 IOPS 和吞吐瓶颈
服务器
xx~t8 小时前
嵌入式学习——ARM1
linux·arm开发·嵌入式硬件·arm
xx~t8 小时前
嵌入式——ARM1(详细篇)
linux·arm开发·嵌入式硬件·arm
我要见SA姐18 小时前
告别 Copilot?Codex 本地化部署指南
运维·数据库·机器学习·oracle·回归
Elastic 中国社区官方博客9 小时前
列式存储并不等同于列式数据库。Columnar 模式为 Elasticsearch 带来了什么
大数据·运维·数据库·elasticsearch·搜索引擎
fengkai454510 小时前
八、Docker详解4-5
运维·docker
智恒百亿10 小时前
RTX 5090 八卡服务器 vs RTX PRO 6000 整机:AI 推理、微调与渲染选型部署指南
运维·服务器·rtx5090
ManageEngineITSM10 小时前
DevOps和ITIL是什么关系?是替代还是互补一文讲清
java·服务器·资产管理·变更管理