【Linux系统编程(文件编程)】之创建、打开文件

news2024/12/30 4:20:57

文章目录

  • 一、前言
  • 二、打开文件、创建文件
    • 1. man手册使用起来
    • 2. `open`函数参数
  • 三、文件权限
  • 四、打开、创建 的代码示例
  • 五、文件创建、打开的补充
    • O_EXCL
    • O_APPEND
    • O_TRUNC
    • creat创建文件函数

一、前言

linux下,一切皆文件。学好对文件的操作是很重要的,会在日常工作当中频繁使用。

如何下Linux下使正确使用函数(使用LinuxC系统函数的正确姿势)?

正确使用分为两部分:导入对应库 & 按照标准格式调用函数

  1. 第一步,导入对应库
    方法之一是利用man手册查询,前提是你要知道函数名字。根据名字查到对应文档,文档中会有该函数的详细信息提供给你。
  2. 第二步,按照标准格式调用函数
    根据第一步的文档,在你写的程序中,结合自己的参数。要保证参数个数、类型是否符合需求。返回值根据需求可自行决定。

二、打开文件、创建文件

1. man手册使用起来

文件的打开、创建都用到名为open的函数

查找open函数的使用方法:(第一部分前言中的第二部就可以使用man手册)
在这里插入图片描述
手册中包含详细说明:包括头文件、重载函数原型,并对其参数和返回值也做出解释。
在这里插入图片描述
open函数返回的是文件描述符,文件描述符的作用是作为对文件操作的入口。通俗的讲,通过文件描述符才能对文件进行访问和修改等。
如果返回值为-1说明发生错误。每次调用open函数最好使用if分支对返回-1的情况进行判断,保证代码健壮性,防止意外错误(个人小建议)。

在这里插入图片描述

2. open函数参数

  • 参数
    • pathname : 文件路径
    • flags : 文件状态标志。简单理解为以只读、只写或者以可读写模式打开文件。
      • 参数标志必须包含以下访问模式之一:O_RDONLYO_WRONLYO_RDWR。分别表示只读、只写、读/写权限打开文件。例如:以O_RDONLY打开文件就不能对文件进行写入操作。
      • 文件创建标志可以按位按位排列。文件创建标志是O_CLOEXEC, O_CREAT, O_DIRECTORY, O_EXCL, O_NOCTTYO_NOFOLLOWO_TMPFILEO_TRUNC。其中O_CREAT常用。
    • mode(可选) : 设置权限 (用户访问权限)
      • 创建文件时,可以设置权限
      • 当在flags中指定O_CREATO_TMPFILE时,必须提供此参数;如果没有指定了O_CREATO_TMPFILE,则忽略mode,不用设置用户访问权限。
      • mode参数的设置选项(部分)
        • S_IRWXU 00700用户(文件所有者)具有读、写、执行权限
        • S_IRUSR 00400用户具有读权限
        • S_IWUSR 00200用户具有写权限
        • S_IXUSR 00100用户具有执行权限
        • S_IRWXG 00070组具有读、写、执行权限
        • S_IRGRP 00040组具有读权限
        • S_IWGRP 00020组有写权限
        • S_IXGRP 00010组具有执行权限
        • S_IRWXO 00007其他具有读、写、执行权限
        • S_IROTH 00004其他有读权限
        • S_IWOTH 00002其他有写权限
        • S_IXOTH 00001其他有执行权限
          补充一下文件权限:每个Linux文件具有四种访问权限:可读( r)、可写(w)、可执行(x)和无权限(-)。利用ls -l命令可以看到某个文件或目录的权限,它以显示数据的第一个字段为准。第一个字段由10个字符组成,如:-rwxr-xr-x
          第一位表示文件类型,-表示文件,d表示目录
          2-4位-rwxr-xr-x表示文件所有者的权限,u权限(user)
          5-7位-rwxr-xr-x表示文件所有者所属组成员的权限,g权限(group)
          8-10位-rwxr-xr-x表示所有者所属组之外的用户的权限,o权限(other)
          2-10位的权限总和有时称为a权限】
  1. 可读 r : 4
  2. 可写 w : 2
  3. 可执行 x :1

举个例子:参数mode为 [0 6 0 0 ] 的含义:[ 0 110 000 000](二进制)<----> [- rw- ]
文件所有者的权限是6。6=4+2,所以文件所有者具有可读、可写权限,但不具有可执行权限。
文件所属组成员的权限是0。文件所有者所属组成员不能对该文件操作。
所有者之外的用户权限是0。所有者之外的用户不能对该文件操作。

三、文件权限

Linux文件权限参考

四、打开、创建 的代码示例

下例:打开文件,失败则创建文件:

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{
	int fd;
	fd = open("./file1",O_RDWR);
	if(fd == -1){//文件打开失败
		printf("open file1 failed\n");
		fd = open("./file1",O_RDWR|O_CREAT,0600);//O_CREATE创建文件
		if(fd > 0){
			printf("create file1 success!\n");
		}
	}
	return 0;
}

在进行文件打开等操作(如open)时,需要注意其返回。换句话讲,对于返回的文件状态要考虑全面:文件打开成功怎么办、失败怎么办。
在编码时,必须要考虑文件打开失败的情况并编写相关处理逻辑,以增加代码健壮性。

可读、可写、可执行的文件的文件名是绿色的。

五、文件创建、打开的补充

在这里插入图片描述
Pathname:要打开的文件名(含路径,缺省为当前路径)
Flags:

  • O_RDONLY 只读打开
  • O_WRONLY 只写打开
  • O_RDWR 可读可写打开

当我们附带了权限后,打开的文件就只能按照这种权限来操作。
以上这三个常数中应当只指定一 个。下列常数是可选择的:

  • O_CREAT 若文件不存在则创建它。使用此选项时,需要同时说明第三个参数mode,用其说明该新文件的存取许可权限。
  • O_EXCL 如果同时指定了OCREAT,而文件已经存在,则出错。
  • O_APPEND 每次写时都加到文件的尾端。
  • O_TRUNC 属性去打开文件时,如果这个文件中本来是有内容的,而且为只读或只写成功打开,则将其长度截短为0。

Mode:一定是在flags中使用了O_CREAT标志,mode记录待创建的文件的访问权限

O_EXCL

使用O_EXCL 如果同时指定了OCREAT,而文件已经在,则open返回-1,创建失败。

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>

int main()
{
        int fd;
        char *buf = "changxianrui hen shuai !!!";
        fd = open("./file", O_RDWR|O_CREAT|O_EXCL);
        if(fd == -1){
                printf("file exist!!!");
        }

        close(fd);
        return 0;
}

O_APPEND

使用O_APPEND在file文件最后新加一行,追加内容。

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf = "changxianrui hen shuai !!!";
        fd = open("./file", O_RDWR|O_APPEND);
        int n_write = write(fd, buf, strlen(buf));
        if(n_write != -1){
                printf("write %d bytes to file\n", n_write);
        }

        close(fd);
        return 0;
}

只使用 O_RDWR 直接写会覆盖文件内前面的内容

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf = "changxianrui hen shuai !!!";
        fd = open("./file", O_RDWR);
        int n_write = write(fd, buf, strlen(buf));
        if(n_write != -1){
                printf("write %d bytes to file\n", n_write);
        }

        close(fd);
        return 0;
}

O_TRUNC

O_TRUNC 截断,必须要先清空文件内容

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        char *buf = "changxianrui hen shuai !!!";
        fd = open("./file", O_RDWR|O_TRUNC);
        int n_write = write(fd, buf, strlen(buf));
        if(n_write != -1){
                printf("write %d bytes to file\n", n_write);
        }

        close(fd);
        return 0;
}

creat创建文件函数

参数类似open函数,负责直接创建文件。
在这里插入图片描述

在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdlib.h>

int main()
{
        int fd;
        fd = creat("./new_file", S_IRWXU);
        if(fd != -1){
                printf("create file success!");
        }
        return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/563433.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

pytorch:nn.ModuleList和nn.Sequential、list的用法以及区别

文章目录 在构建网络的时候&#xff0c;pytorch有一些基础概念很重要&#xff0c;比如nn.Module&#xff0c;nn.ModuleList&#xff0c;nn.Sequential&#xff0c;这些类我们称为为容器&#xff08;containers&#xff09;&#xff0c;可参考containers。本文中我们主要学习nn.…

3D模型渲染引擎6大特点解读:助力AR/VR呈现惊叹的视觉效果!

一、用于桌面、移动和 AR/VR 应用程序的2D和3D图形引擎 HOOPS Visualize是一个3D图形SDK&#xff0c;可以快速开发高性能、跨平台的工程应用程序。主要特点包括&#xff1a; HOOPS Visualize的基石是图形内核&#xff0c;这是一种功能齐全、以工程为中心的场景图形技术&#…

项目实战(cloud)--配置中心Config(码云来做一个配置中心)

服务的拆分原则&#xff1a; 单体应用向微服的一个改造&#xff1a; 搭建一个聚合项目 创建一个maven项目 父项目 pom <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"…

uCOSii信号量

uCOSii信号量 主要用来测试使用uCOSii“创建信号量,发送信号量&#xff0c;接收信号量,删除信号量”。 学习uCOSii一定要先了解os_cfg.h文件。 信号量管理函数如下&#xff1a; OSSemAccept() 无条件地等待请求一个信号量函数,中断服务子程序只能用OSSemAccept()而不能用OS…

Docker介绍、常用命令、项目部署

什么是Docker 简单说&#xff1a;Docker就是一个虚拟机&#xff0c;专业说&#xff1a;它是一个开源的容器平台。它和我们常用的VMware有很多相似的地方。 名词解释 镜像/images 由本体打包出来的文件。并不是文件本身&#xff0c;但是具有该文件的功能。举个不太贴切的例子&…

离线安装python、pip和python的第三方库

1.安装python3 1.1下载python3 安装python3的网址为点击这里 选择想要下载的对应版本进行下载&#xff0c;这里使用的是63位的Windows系统&#xff0c;因此下载的选的是&#xff1a; 下载后如图&#xff1a; python-3.7.9-amd64.exe是python3的安装程序 1.2安装python3 1…

5月第3周榜单丨飞瓜数据B站UP主排行榜单(哔哩哔哩)发布!

飞瓜轻数发布2023年5月15日-5月21日飞瓜数据UP主排行榜&#xff08;B站平台&#xff09;&#xff0c;通过充电数、涨粉数、成长指数三个维度来体现UP主账号成长的情况&#xff0c;为用户提供B站号综合价值的数据参考&#xff0c;根据UP主成长情况用户能够快速找到运营能力强的B…

BLE协议栈结构

// 开坑BLE协议栈 0 镇楼图 接下来会自下往上粗略分析各个层级&#xff0c;后续会有对各层的细致解读 1 CONTROLLER 1.1 PHY BLE使用ISM频段&#xff08;频率范围是2.400-2.4835 GHz&#xff09;。将整个频带分为40份&#xff0c;每份的带宽为2MHz&#xff0c;称作RF Chann…

CASAIM与北京体育大学达成合作,高精度三维扫描技术助力体育运动装备仿真分析

近期&#xff0c;CASAIM与北京体育大学开展合作交流&#xff0c;基于高精度三维扫描技术助力体育运动装备仿真分析&#xff0c;为体育运动装备可靠性研究提供准确的数据参考。 北京体育大学是全国重点院校、国家“211工程”重点建设大学、国家首批“双一流”建设高校&#xff0…

基于springboot+vue社区团购系统(分前后台springboot+mybatis+mysql+maven+vue+html)

基于springbootvue社区团购系统 一、项目简介二、技术实现三、开发运行环境四、系统功能五、页面展示六、数据库七、项目结构八、部分代码展示九、源码地址 一、项目简介 本项目是一套基于springboot社区团购系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项…

【正点原子STM32连载】 第十六章 外部中断实验 摘自【正点原子】STM32F103 战舰开发指南V1.2

1&#xff09;实验平台&#xff1a;正点原子stm32f103战舰开发板V4 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id609294757420 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第十六…

【Sentinel】流控、熔断、热点基本介绍和使用

目录 环境介绍Sentinel的使用可以分为两个部分Sentinel管理控制台客户端接入控制台配置启动参数流控规则名词解释 熔断策略公共字段说明慢调用比例字段说明 异常比例字段说明异常数字段说明 热点规则 环境介绍 开发依赖版本Spring Boot3.0.6Spring Cloud2022.0.2Spring Cloud …

一文搞清RabbitMQ的部署运维及使用

1.通过docker-compose安装RabbitMQ 1.0 初始化yum和Docker yum update yum install epel-release -y yum clean all yum list yum install docker-io -y1.1 dockerfile FROM rabbitmq:management MAINTAINER LCJ # 添加插件到指定目录 可按照此方式自行扩展其他插件 # ADD .…

shopee虾皮跨境电商网站商品数据支持网站后缀(.com.my;.vn;.ph)

作为一名技术爱好者&#xff0c;我们总会遇到各种各样的技术问题&#xff0c;需要寻找合适的技术解决方案。而在互联网时代&#xff0c;我们可以快速通过搜索引擎获取丰富的技术资源和解决方案。然而&#xff0c;在不同的技术分享中&#xff0c;我们常常会遇到质量参差不齐的文…

【新星计划·2023】单臂路由的原理讲解

单臂路由是指在路由器的一个接口上通过配置子接口的方式&#xff0c;实现原来互相隔离的VLAN之间可以互相通信。 一、单臂路由概述 网络中通过VLAN技术来实现隔离广播、方便管理及提高安全性等功能&#xff0c;一旦划分VLAN后&#xff0c;同—VLAN之间可以相互通信&#xff0…

【统计模型】瑞典生育率现状与影响因素分析

目录 瑞典生育率现状与影响因素分析 一、研究目的 二、数据来源和相关说明 三、描述性分析 3.1 样本描述 3.2 数据可视化 四、数学建模 4.1 模型建立 4.2 模型结果 &#xff08;1&#xff09;全模型A &#xff08;2&#xff09;全模型B &#xff08;3&#xff09;全…

传奇手游三职业1.80合击服务端三端互通版搭建教程

传奇手游三职业1.80合击服务端三端互通版搭建教程 大家好&#xff0c;我是驰网艾西。随着时代的发展&#xff0c;以前我们热爱的传奇游戏也越来越没有时间玩了&#xff0c;到了一定的年纪大家都有自己的事业以及生活压力。以前我们总是玩PC端所谓的端游&#xff0c;现在大家都…

highcharts矢量图放在图表的最上方

将矢量图对应的y轴的top和height都设置为0 即可 下面红色标注全是y轴的设置 以上这中图怎么实现 其中top是指图表中每个模块的位置&#xff0c;offset表示偏移的位置&#xff0c;height表示每个模块占据整个图标的高度的百分比&#xff0c;opposite表示该y轴是否在右侧&#xf…

麒麟系统安装HDP【已解决】

麒麟系统安装HDP 麒麟系统安装HDP1、软件版本介绍2、文件替换3 报错解决3.1 解决KeyError: HDP-3.1&#xff08;所有机器&#xff09;3.2 安装smartsense-hst&#xff08;所有机器&#xff09;3.3 解决Non-ASCII character \xe5 in file&#xff08;所有机器&#xff09;3.4 解…

如何解决端口号被占用的方法

在学习JavaWeb的过程中&#xff0c;在运行代码的时候经常会提示端口号被占用的情况&#xff1b;出现这情况的主要原因就是没有正常关闭tomcat。 那么遇到这种情况应该怎么解决呢&#xff1f; 首先第一种方式就是把电脑关机重启&#xff0c;这种方法可谓是百试百灵&#xff1b;另…