该文件可能是只读的 或者您要访问的位置_Linux应用编程之文件操作 系统调用篇(下)...

2f7ed0f84df2087c1521a7b6d5b1916d.gif 关注、星标公众号,直达精彩内容

18e88633d7edb303ac0b24dd18ded75a.png

ID:嵌入式情报局

作者:情报小哥

1文件操作实战

    上篇文章跟大家介绍了Linux系统调用的文件操作API函数,其实跟C语言中的文件读取操作差不多,所以今天小哥就利用那些API在Linux操作系统下面进行一些实战演示。

2文件操作演示

1、创建并写一个文件

73af2ece6324a7588132886975c16c38.png

解读一下

  • 该程序中需要使用到3个函数open、write和close,一般对于他们的使用都会使用到相应的头文件,可以使用上一节介绍的"man 2 函数名"来进行查找。

  • 比如使用open函数一般需要包含如下头文件,同时相关的参数也会在下面给出解释 :

4ce096b618f0fa628c7ed7ba68e89eef.png

  • 其中open函数的第二个参数表示打开的标志,常用的如下:

  • O_RDONLY:只读方式打开

  • O_WRONLY:只写方式打开

  • O_RDWR:可读可写方式打开

  • O_APPEND :表示追加方式打开,在文件末尾继续写入

  • O_CREAT :表示如果指定文件不存在,则创建这个文件

  • O_NONBLOCK :如果路径名指向 FIFO/块文件/字符文件,则把文件的打开和后继 I/O设置为非阻塞模式。

  • 其中open函数的第三个参数表示文件访问的初始值,在第二参数为create的时候有效,且与当前进程的用户掩码umask共同决定,常用的如下:

  • S_IRUSR /S_IREAD : 00400权限,代表该文件所有者具有可读取的权限。

  • S_IWUSR /S_IWRITE : 00200 权限,代表该文件所有者具有可写入的权限。

  • S_IXUSR /S_IEXEC : 00100 权限,代表该文件所有者具有可执行的权限。

实验现象

  • 上面的程序通过创建并打开文件,写入字符串并关闭。

ede0779e1507d699e97bf73df81d0235.png

  • 进一步查看所创建的文件,得到正确结果。

f0da133fcc4ef26639ce19f6f3e75a24.png

2、读取文件内容

ec03995f6dd4c5b4b0ab0ef739001c2e.png

解读一下

  • 上面代码以只读方式打开文件,并且读取里面的数据放到Buff里面打印输出,应该比较简单。

实验现象

  • 实验现象如下,并且成功打印了之前写入到文本中的数据。

cac6e394770cfcbc32f557c141a31241.png

3、文件定位

86d01f263ac9712acff1276725c2b4aa.png

解读一下

  • 当最开始打开文件时,默认文件读写指针是指向第一个字节处,其后续的写入或者读取数据都是在该文件指针处开始进行操作。

  • 通过调用lseek函数我们可以重新定位文件读写指针,从而实现在文件的任意位置追加数据内容等。

  • 下面是lseek系统调用的解析:

1c6181637060d95828bef89abf4be269.png

  • 参数fd : 要操作的文件描述符

  • 参数offset : 相对于whence(基准)的偏移量(可正可负)

  • 参数whence : 分别为SEEK_SET(文件开头)、SEEK_CUR(文件指针当前位置)、SEEK_END(文件末尾)

  • 返回值:文件读写指针距文件开头的字节大小,出错,返回-1

实验现象

  • 上面的实验通过使用SEEK_END文件末尾并且偏移0来使用,那么最终返回文件指针相对文件开始字节个数,从而达到计算文件长度的目的,其输出结果如下图所示:

fed2ec7f7e424432eb504b8eef3a43b3.png

3最后

    这里小哥就介绍了Linux系统调用文件操作几个非常重要的API,还有其他API比如access进行访问权限的访问等等,大家可以通过查找相关手册学习了解,或者下次使用到了具体查阅系统手册,今天就到这里了,下期见!

我是情报小哥,一个90后嵌入式自学玩家!

5e8c2802068901af4a2691f06cf04369.gif

e4666186b4aa4a8e171b5cec3b8862c1.png

长按前往图中包含的公众号关注

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值