ch1文件io操作

Linux环境高级编程初学复盘

Linux下的文件IO系统调用

文件与文件描述符

1.文件扩展名

Linux下有许多文件扩展名,其是人为规定的一种文件后缀,一般设定如此,这样设置可以让自己和其他人更加方便地根据该文件扩展名来识别该文件类型与作用等信息

.tar,.tat.gz,.tgz,.zip,.tar.bz 表示压缩文件,通过tar,gzip,unzip命令创建

.sh 表示shell脚本

.pl perl语言文件

.py python语言文件

.conf 系统服务配置文件

.c c语言文件

.h 头文件

.cpp c++源文件

.so 动态库文件

.a 静态库文件

2.文件类型

在linux下可以通过ls -l 查看文件的详细信息,文件详细信息的第一个字母及代表文件的类型

普通文件(-),目录文件(d),符号链接(l),字符设备(c),块设备(b),管道(p),套接字socket(s)

3.文件描述符

Linux系统下一切皆文件,所以linux内核为管理已经打开的linux文件,引入了一个文件描述符文件(fd)(file descriptor)来指定这个文件,其作用类似于c语言中的指针,有指代某一对象的作用,用户可以通过对该文件描述符对某个文件进行读与写等操作,第一次调用进程或线程时,系统默认会打开三个文件描述符,即0(标准输入),1(标准输出),2(标准出错),所以用户第一个创建的文件描述符一定为3

文件描述符用途POSIX文件描述符标准I/O文件流
0标准输入STDIN_FILENOstdin
1标准输出STDOUT_FILENOstdout
2标准出错STDERR_FILENOstderr

文件io操作函数

1.在linux下基于文件描述符对文件进行操作一般使用的系统调用有:

open(文件绝对路径(*path),文件的操作状态(oflag),…(可选项)),其作用为通过该绝对路径,以什么样的操作状态去读取该函数(只读,只写,读写等),其返回值为一个文件描述符(fd),该fd指向该文件

read(文件描述符(fd),将文件读取到的存储空间名(buf),存储空间大小(sizeof(buf))),该函数是通过文件描述符对指向的文件进行读操作,读取里面的文件内容到一个存储空间中去(自定义),printf(“%s\n”,buf)打印读到的文件内容,其返回值是一个整数,其含义是指从文件中读到多少个字节的内容,不过可能存在文件偏移量读取不到内容的情况(由于写时,文件的偏移量会发生变化,如果不改变该文件偏移量,读时会自动从该文件偏移量位置进行读取,一般写操作结束后,文件偏移量会置于文末,所以很有可能read时会提示读到0字节的情况)

write(文件描述符(fd),写入的数据内容(buf),写入的数据大小(sizeof(buf))),该函数通过文件描述符对文件进行写操作,将写入的数据内容写入到文件中,其返回值为一个整数,和read一样,提示向文件中写了多少个字节的数据

create(文件名,文件权限),该函数通过创建一个新的文件并返回一个指向其的文件描述符(fd),该函数少用,一般使用open在oflag选择参数来创建文件,并定义后面的文件权限

close(文件描述符)该函数用于关闭文件描述符,释放内存空间

lseek(文件描述符,相对于文件偏移后位置的偏移量(offset),文件偏移后的位置(whence)),该函数可以修改文件的偏移量,一般写操作后,都会将文件偏移量从新设置,以便后期read可以读到

dup(文件描述符(new))和dup2(要重定向到该文件中的文件描述符(new),被重定向的文件的文件描述符(old)),这两个函数都是将文件重定向

sta()和fstat(),这两个函数是用于返回文件或目录的详细信息的(暂时未用到)

access(文件名,要测试的权限),该函数用于测试权限位,可选读写执行与是否存在等权限

unlink()该函数用于删除文件

rename(旧文件名,新文件名)对文件进行重命名

2.linux下对文件夹操作的系统调用有

函数函数说明
mkdir创建文件夹
rmdir删除文件夹
opendir打开文件夹
readir读文件夹
closedir关闭文件夹
chdir改变工作目录

文件出错与出错处理

linux下出错的原因有很多种,所有有一个变量(errno)来保存文件出错的标号,来标识文件出错的原因序号,然后我们在程序中一般需要打印文件出错的原因,linux中有两个出错处理的函数perror和strerror,由于perror的输出格式过于固定,而且只能打印到标准输出上所以一般我们在出错处理时,一般会使用strerror来处理,使用printf(“%s\n”,strerror(errno)),来打印出错原因

学习过程中碰到的细节知识点

1.通过宏定义 #define 将文件绝对路径简化为一个宏定义,方便引用

2.strlen()函数可以求字符串的长度等,strlen与sizeof的区别(待补充)

3.int main(int argc,char**argv),其中argc是命令行参数个数,argv是一个二维数组,存储的是命令行参数(存储在内存空间中的命令参数区)

4.自定义一个buf空间,如果没有对buf空间进行初始化,buf空间里面则存的是垃圾文件,read的时候可能出现乱码,所以在用到buf前。即read前,需要对buf进行初始化,使用一个初始化函数memset((初始化的存储空间名)buf,(一般设置0)0,(初始化的存储空间大小)sizeof)

5.goto:跳转到cleanup,进行文件描述符的关闭,返回等操作

6.return()与exit(),在普通函数中,return会使函数提前结束,但不影响main函数的执行,但在普通函数中,如果使用exit(),则会两个函数都退出,该普通函数和程序均退出,在main函数中调用return()和exit()函数都会使程序退出

7.获取一个文件夹目录的内容,一般定义一个结构体指针来接收

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值