Linux 文件I/O编程基础

Linux文件I/O

C语言条件下:Linux中有文件I/O与标准文件I/O
首先,Linux文件类型:- 普通二进制文件、p 管道文件、l 连接文件、s套接字文件、d目录文件、c字符文件(嵌入式软件工程师大多数打交道的文件)、b 块设备文件
在linux中,标准文件I/O可以看作是文件I/O的衍生品;
文件I/O源自于Linux操作系统内核,标准文件I/O源自于标注C库,可以理解为标准C库的文件I/O可以用作不同平台之间的移植,从而达到提高在不同平台上操作文件时代码复用性的目的,而Linux内核提供的文件I/O用于Linux底层开发。

二者区别

文件I/O 标准I/O

来源: Linux内核提供函数接口 标准C库提供函数接口(只要有stdio.h等一系列文件支持即可)

操作对象: *打开*Linux下大部分文件 仅打开ASCII文件、普通二进制文件

机制: 直接打开硬盘上的文件 将硬盘的数据缓存到内存中,通过数据流(FILE)来进行操作

操作介质: 文件描述符(int型描述符 0~1023) 数据流(FILE)
其中0~2为标准C库占用

操作函数: open()/close()/read()/write()/lseek() fopen()/fclose()/fread()/fwrite()/fseek()/ftell()/feof()/fgets()

另: 操作目录文件:
opendir()/closedir()/readdir()/chdir()
(不存在写目录函数,目录信息由文件系统构建,写目录属于非法操作。)

两类I/O各函数原型

标准库提供的文件I/O–> 文件:stdio.h

1、打开文件:FILE *file=fopen(”filename&path”,“r/r+/w”);
2、关闭文件:fclose(file);
3、写数据到文件:fwrite(buf,size,nmeber,FILE *file);
4、读数据到buf:fread(buf,size,nmeber,FILE *file);
5、判断是否结尾:feof(FILE*file);
6、查找光标位置:ftell(FILE* file);
7、调整光标位置:fseek(file,offset,SEEK_SET|SEEK_CUR|SEEK_END”);
8、获取输入字符(相对gets()更安全):fgets(&buf,size,file);
注:文件操作函数不能直接在文件中间插入数据,文本编辑器等软件都是在内存中不断拼接、拷贝数据,实现在文件任意位置插入数据(这种情况频繁操作磁盘I/O,容易出问题)。抑或通过数据位置的记录,在内存中散乱存放数据并保存数据在文件中的位置,最后写入文件时通过内存的文件数据块携带的位置信息按照预定协议写入文件(这种情况需要消耗内存,对于较大文档需要优化)。

文件I/O提供的文件I/O–>文件:sys/types.h、sys/stat.h、fcntl.h、unistd.h

1、打开文件:int fd=open(“finname&path”,”O_RDONLY|O_WRONLY|O_CREAT”,mode_t mode);
返回值:>0 文件描述符; -1–>失败
2、关闭文件:close(int fd);
返回值:0–>成功;-1–>失败
3、读取文件:read(fd,&buf,size_t count);
返回值:’>0‘–>读取到的字节数;-1–>失败;0–>到达文件末尾
4、写文件:write(int fd,char *buf,size_t count);
返回值:‘ >0’–>写入字节数;-1–>失败;
(注:wirte函数需要检查是否写入字节数等于要求写入字符数count,以免在写入数据时候丢失数据)
5、光标位置调整:lseek(int fd,off_t offset,“SEEK_SET、SEEK_CUR、SEEK_END”);
返回值:-1–>失败;>=0 –>文件当前位移

文件I/O提供的操作目录文件的函数–>文件:unistd.h

1、打开指定目录:DIR *target=opendir(“path”);
返回值:0–>打开成功;-1–>失败
2、关闭指定目录:int closedir(DIR target);
返回值:0–>成功;-1–>失败
3、读取指定目录对应的信息:struct dirent * file_list=readdir(DIR target);
返回值:struct dirent *:目录信息;-1 –>失败
4、改变当前目录:int chdir(“path”);
返回值:0–>成功;-1–>失败

获取Linux下文件基本属性–>文件:unistd.h、sys/types.h、sys/stat.h

文件属性结构体:struct stat
Linux下变成手册第二章:man 2 stat(查询指令)
函数:获取指定文件属性:stat(“path”,struct stat *buf);
返回值:0–>成功;-1–>失败

getgrgid(uid_t st_uid) –>获取用户名
ctime(time_t st_ctime) –>获取文件更改时间(并将时间数据、格式转换)

猜你喜欢

转载自blog.csdn.net/amddma/article/details/77881571