day05

本文详细介绍了Linux系统中文件的读写操作及其系统函数,包括文件描述符、open、close、read、write等核心函数的用法。并提供了一个员工管理系统案例,涉及员工注册与查询功能的实现,演示了如何将数据结构体转换为易读的字符串格式存储。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件和文件的读写函数(讲和练综合 重点)
由于在Linux系统中,文件几乎可以代表一切,因此,操作文件的函数也可以操作其他的一些设备/东西。


文件相关函数包括:文件读写函数/非读写函数
标c文件读写函数:fopen() fread() fwrite() fclose()
标c取文件大小的函数:fseek(SEE_END) 再调ftell()的返回值就是文件的大小
标c的函数不能直接访问内核,因此必须有文件相关的系统调用才能实现功能。文件读写系统函数:
open() read() write() close() icotl()
其中icotl()目前用不上,因此不讲。
open()和close()
open()创建/打开一个文件,返回文件描述符。
close()可以通过文件描述符关闭打开的文件。
文件描述符本质是一个非负整数,代表一个打开的文件。文件描述符的范围是3-打开的最大数量,Unix是63,Linux可以到255,0,1,2,被系统预先占用,代表标准输入。标准输出和标准错误。文件描述符在关闭后可以重复使用。系统在选择文件描述符时,会找目前未使用的最小值。
文件描述符只是一个整数,如何代表一个打开的文件呢?
open()会打开一个文件,返回文件描述符,真实过程:
open()先找到硬盘上的文件,把文件的相关数据加载到内存中,放入文件表(可以看成结构体)中,找一个未使用的整数代表文件表,这个未使用的整数就是文件描述符。
每个进程在启动时,都会创建一个文件总表,存放文件描述符和文件表的对应关系,总表中找不到的整数就是未使用的。open()每返回一个描述符,都会把这个描述符加入总表中。close()每关闭一个描述符,其实都是把描述符从总表中删除,不一定会删除文件表,一个文件表可以对应多个文件描述符,只有没有任何文件描述符与之对应的文件表才会被删除。


ls -l a.text
_rw_rw-r__(文件在硬盘上的权限)
fopen("a.text","r");文件指针操作文件时的权限(内存)文件有两套数据,一套是文件在硬盘上的,一套是加载到内存中的
文件在硬盘上是通过i节点进行管理的,i节点也是整数,i可以看出文件在硬盘上的地址,系统通过i节点(inode)找到文件和目录。ls -i可以查看i节点


int open(char* filename,int flag,……)
功能:打开一个文件,并返回文件描述符。
flags是文件打开的标识,由一些宏组成:
……叫可变长参数,代表0-n任意类型的按数。


其中,flags常见的值:
O-RDONLY O_WRONLY O_RDWR三选其一 打开文件的权限
O_CREATE 代表可以新建不存在的文件,需要第三个参数(o666),指定文件在硬盘上的权限。
O_EXCL  代表如果文件存在,返回-1 而不是打开(只新建不打开)必须和O_CREAT结合使用
O_TRUNC代表如果文件存在,打开时文件的内容(小心使用,因为文件中的数据直接删除)
    O_APPEND 代表以追加的方式代开文件,针对追加写
返回:成功返回文件描述符,失败返回-1.
int read(int fd,void* buf,int size)
int write(int fd,void* buf,int length)
功能:读写文件函数
参数:fd 都是文件的描述符,buf是接受数据的首地址,
size就是buf的大小,data是要写入的数据的首地址,
length是数据的有效长度
返回值:失败都返回-1,成功都返回实际读写的字节数
读文件时,返回0代表读到了文件尾(结束条件)


练习:
用UC函数实现文件的复制。
思路:读a文件,写入到目标文件




实现一下员工管理系统中的部分功能
员工注册和员工查询
要求:员工注册就是把员工的信息存入文件中,员工信息通过scanf()输入,包括:员工ID/员工姓名/员工薪水sal.


员工查询就是把所有员工的信息从文件读到程序中并且打印出来即可。
思路:
1.写头文件,头文件中包括员工结构体。员工注册和员 工查询写2个.c文件。
2.员工注册实现注册一次就可以,但往文件中写信息时用追加(O_APPEND)的方式。
3.如果有空余时间的同学,员工注册时不允许重复id.


如果希望写入的文件的数据可以直接看明白,如何实现?
思路:
只有字符串能直接看明白,因此需要把结构体中的数据拼接成一个大的字符串再写入文件。
写文件时改一下文件名)


注:在应用中,如无特殊要求,写入数据还是写结构体。
读写文件时,数据的格式必须要保持一致。
目前为止,读写文件可以使用UC和标C函数,那么如何选择


time a.out可以测试运行时间


标c的输出函数都有缓冲区的存在,因此真实的读写文件的次数和循环次数是不同的,而UC函数在用户层是没有缓冲区大的。UC函数在频繁读写时需要程序员自定义缓冲区以提升效率,缓冲区的大小不是越大越好,可能需要测试,找到最佳大小,(标c函数也可以通过改变缓冲区的大小提升效率)




作业:
1.再次熟悉(背)string.c和今天的代码
2.参考员工管理系统,做用户注册和用户登录。
其中,用户信息包括:用户名/email/密码,密码需要输入2次,一样才能注册成功,不一样的要反复提示输入。
用户注册时,需要判断用户名是否重复(第一个版本可以先不考虑)。
用户登录时,打印登录是否成功即可。有相同的用户名和密码就成功,否则就登录失败。













































评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值