当前位置: 首页 > news >正文

Linux系统编程----文件编程

文件编程

1、基于库方式实现

2、基于系统调用方式实现


详细说明常用函数

一、系统IO

1、fopen

#include<stdio.h>

FILE *fopen(const char *pathname,const char *mode)

功能:打开文件,并关联一个流

参数:@pathname:文件名

@mode:模式

返回值:成功:返回FILE*,失败返回NULL&&errno

补充:模式: r---只读

r+---读和写 //这两个要求文件必须存在

w---只写

w+---读和写 //这两个若文件不存在则创建,存在则被截断

a---追加

a+----追加读和写 //这两个文件存在则定位到末尾开始写,不存在则创建

2、fgetc

int getc(FILE *stream)

功能:从流中获得数据(一次只能读取一个字符)

参数:@stream:fopen打开后获得的流指针

返回值:成功:返回读取到的字符,失败:返回EOF(读到末尾也返回这个)

3、fputc

int fputc(char c,FILE*stream)

功能:将字符c输出到流中

参数:@c:要输出的字符

@:stream:流

返回值:成功:返回要输出的字符,失败:返回EOF

4、fgets

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

功能:从stream中读取数据,存放到s指定空间,最多读取size-1个字符

参数:@s:存放的数据空间

@size:要读取的字节数

@stream:要读取的文件流

返回值:成功:返回s,失败:返回NULL

5、fputs

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

功能:将s中的字符输出到stream中

参数:@s:代表要输出的字符串

@stream:要输出到的文件

返回值:成功:返回非负数,失败:返回EOF

6、fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从 stream 中读取 nmemb 个元素,每个元素大小 size 存放到 ptr 指定的空间

参数:@ptr 一块存储空间
@size 单个元素大小
@nmemb 元素的个数
@stream 要读取的文件

返回值:成功 → 返回读取到的元素个数
失败 → 0
到达文件结尾也返回 0

7、fwrite

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:将存放再 ptr 指定的空间中 nmemb 个元素,每个元素大小 size,写入到 stream 中

参数:@ptr 一块存储空间
@size 单个元素大小
@nmemb 元素的个数
@stream 要写入的文件

返回值:成功 → 返回写入到的元素个数
失败 → 0

8、fseek

int fseek(FILE *stream, long offset, int whence);

功能:将 stream 指定的文件,定位到 offset 的位置,以 whence 作为参考起点

参数:@stream 代表要操作的文件
@offset 偏移量
@whence 表示参考起点
SEEK_SET // 文件开头 → offset 不能是负的
SEEK_CUR // 当前位置 → offset 可正可负
SEEK_END // 文件末尾 → offset 可正可负

返回值:成功 → 返回 0
失败 → 返回 -1

说明:
fseek 可以往后偏移,偏到文件末尾之后配合一次写操作可以产生空洞(hole)文件
云盘下载文件时,空洞文件提前抢占磁盘空间
空洞文件创建步骤:
a. 先偏移
b. 做写操作

9、rewind

void rewind(FILE *stream);

功能:回到文件开头

10、ftell

long ftell(FILE *stream);

功能:获得文件位置指示器的当前偏移量

补:获得文件大小:
fseek(fp, 0, SEEK_END);
offset = ftell(fp); // offset 就是文件的大小

二、文件IO

1、open

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

功能:打开文件
可以创建文件

参数:@pathname 这个参数用来指定要打开的文件(格式:字符串形式)
@flags 指定访问模式
必选项:必选其一
O_RDONLY // 只读
O_WRONLY // 只写
O_RDWR // 读写
附加:
O_APPEND // 追加
O_CREAT // 创建文件
O_TRUNC // 截断为0

返回值:成功 → 文件描述符
失败 → -1 && errno被设置

补:

fopen(...)对应open(...)调用
fopen("r")open(, O_RDONLY)
fopen("r+")open(, O_RDWR)
fopen("w")`open(, O_WRONLY
fopen("w+")`open(, O_RDWR
fopen("a")`open(, O_WRONLY
fopen("a+")`open(, O_RDWR

文件操作权限:- rwx rwx r-x // 表示文件类型 —— 此时是普通文件

rwx — read/write/execute
三组权限:
所有者 → rwx
所属组 → 同一组的 → rw-
其他人 → r--

例子:rwx rwx r-x 111 111 101 // 7 7 5
一般带mode的open("1.txt", O_WRONLY | O_CREAT, 0666); // 八进制数值

2、close

int close(int fd);

功能:就是把文件描述符关闭

3、read

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

功能:从 fd 中读取 count 个字节的嗯数据,存放到 buf 中

参数:@fd // 要读书的文件 → 应为“要读的文件”
@buf // 存放数据的缓冲区
@count // 要读取的字节数

返回值:成功 → 返回读取到的字节数
失败 → 返回 -1
到达文件结尾 → 返回 0

4、write

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

功能:将 buf 中的 count 字节写入到 fd 中

参数:@fd —— 要操作的文件
@buf —— 数据存放的空间
@count —— 要写入的字节数

返回值:成功 → 返回写入的字节数
失败 → -1 && errno被设置

5、lseek

off_t lseek(int fd, off_t offset, int whence);

功能:重新定位文件偏移量

参数:@fd → 要定位的文件
@offset → 表示一个偏移量 —— 可正可负
@whence → 表示参考点
SEEK_SET // 从文件开头开始计算
SEEK_CUR // 从当前位置开始计算(可正可负)
SEEK_END // 从文件末尾开始计算(可正可负)

返回值:成功 → 返回从头开始的偏移量(即新的文件位置)
失败 → 返回 -1 && errno会被设置

示例:// 定位到开头 lseek(fd, 0, SEEK_SET);
// 定位到末尾 lseek(fd, 0, SEEK_END);
// 定位到距开头 100 字节处 lseek(fd, 100, SEEK_SET);

获取文件大小:off_t len = lseek(fd, 0, SEEK_END);

空洞文件创建示例:// 1. 定位 lseek(fd, 100, SEEK_SET);
// 2. 写操作 write(fd, "", 1);
// 写入 1 个空字节,在偏移 100 处创建“洞”

6、fdopen

将fd转为fp

7、fileno

流指针转换为 fd

8、opendir

DIR *opendir(const char *name);

功能:打开一个目录,并关联一个目录流

参数:@name —— 目录名

返回值:成功 → 返回目录流指针
失败 → NULL & errno

9、readdir

struct dirent *readdir(DIR *dirp);

功能:读取目录,获得目录项结构体

参数:@dirp → 代表对应的目录流

返回值:成功 → 返回保存目录项信息的结构体的地址
失败 → 返回 NULL && errno被设置
读到目录流末尾 → 返回 NULL

struct dirent
{
ino_t d_ino;
off_t d_off;
unsigned short d_reclen;
unsigned char d_type;
char d_name[256];
}

10、closedir

int closedir(DIR *dirp);

功能:关闭对应的目录流

返回值:成功 → 0
失败 → -1

http://www.jsqmd.com/news/496841/

相关文章:

  • 10000立方拱顶油罐(CAD)
  • 美团CPS系统中Java使用NIO提升网络通信效率的实战技巧
  • 基于 Flutter × HarmonyOS 6.0 的跨端打车平台— 服务类型选择模块实战解析
  • C++代码质量与规范:编写优雅且可维护的代码
  • 淘宝闪购SPS系统中Java服务的CPU密集型任务优化处理技巧
  • 卡尔曼滤波SOC算法模型
  • DeepChat入门必看:理解‘数据永不离开服务器’背后的容器网络隔离原理
  • WiFi 问题记录
  • 二维码生成器:从前端到打印的全流程
  • 霸王餐CPS系统中Java实现异步化处理提升系统吞吐量的技巧
  • 贪心算法集
  • MarioVerse:基于 Flutter × HarmonyOS 6.0 的超级玛丽游戏画布区域实现详解
  • Qwen2.5-VL-7B-Instruct图文交互教程:多模态思维链(MoT)提示工程
  • 算法基础·C++常用操作
  • 华为AI产品和技术由浅入深巅峰解析
  • SiameseUIE企业级落地案例:政务公文关键信息(人物/机构/事件)批量抽取
  • 常州代理记账哪家好?从一套“糊涂账”说起的实战拆解 - 企师傅推荐官
  • windows装系统教程
  • MarioVerse:基于 Flutter × HarmonyOS 6.0 的超级玛丽跨端游戏控制系统深度解析—从 UI 设计到跨端适配的「游戏控制区域」实战拆解
  • 2026年3月江苏铝合金工具箱/冷冻盒/走台板/托盘/高空作业平台/塔筒平台盖板生产厂家竞争格局深度分析报告 - 2026年企业推荐榜
  • 目前去渍最好的选哪款?2026真实测评美白去垢牙膏品牌推荐:洁净牙齿 - 资讯焦点
  • php python+vue请假考勤功能需求分析
  • AOP切面(是一种思想)
  • 如何在VirtualBox中安装银河麒麟桌面操作系统V10
  • UGUI不规则形状按钮(基于图标不透明区域)
  • Docker上部署前后端分离项目
  • 2026北京婚纱摄影机构对比:如何选到靠谱好店 - 博客万
  • 外贸企业为什么“有产品却没有客户”?问题可能出在获客方式 - 资讯焦点
  • C# WinForms机房管理系统源码|支持SQL Server/MySQL/Access多数据库|.NET Framework窗体应用
  • 机试搜索----dfs