C语言 linux文件操作(一)

一、linux文件权限

字符表示法 二进制 十进制  		  说明
r - -     100      4     		  仅可读
- w -     010      2     		  仅可写
- - x     001      1     		  仅可执行
r w -     110      6     		  可读可写
r - x     101      5     		  可读可执行
- w x     011      3     		  可写可执行
r w x     111      7     		  可读可写可执行
- - -     000      0     		  无权限

二、C语言文件读写

int open(const char *pathname, int flags);

2.1 flags参数详解

  1. O_CREAT:在文件打开过程中创建新文件
  2. O_RDONLY:以只读方式打开文件。
  3. O_WRONLY:以只写方式打开文件。
  4. O_RDWR:以读写方式打开文件。
  5. O_APPEND:在文件末尾追加数据,而不是覆盖现有内容。
  6. O_TRUNC:如果文件已经存在,将其截断为空文件。
  7. O_EXCL:与 O_CREAT 一起使用时,如果文件已经存在,则 open() 调用将失败。
  8. O_SYNC:使文件写操作变为同步写入,即将数据立即写入磁盘。
  9. O_NONBLOCK:以非阻塞方式打开文件,即使无法立即进行读写操作也不会被阻塞。

当文件为空的时候,文件指针初始化指向0的位置,随着写入,文件指针会落到最后一个字符的后面。当文件描述符被关闭后,重新使用open函数文件指针会指向0。

open 函数

open 函数用于打开一个文件,并返回一个文件描述符(file descriptor),这个描述符可以用于后续的文件读写操作。

语法

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

int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
  • pathname 是要打开的文件的路径名。

  • flags 是打开文件时的标志,它可以指定文件的打开方式(例如只读、只写、追加等)。一些常用的标志包括:

    • O_RDONLY: 只读方式打开文件
    • O_WRONLY: 只写方式打开文件
    • O_RDWR: 读写方式打开文件
    • O_CREAT: 如果文件不存在则创建文件
    • O_APPEND: 追加方式打开文件
    • 等等(可以使用按位或 | 连接多个标志)。
  • mode 是一个权限参数,仅在使用 O_CREAT 标志创建文件时才需要。它指定了文件的权限,比如 0644

返回值

  • 如果成功,open 函数返回一个非负整数的文件描述符,可以用于后续的文件 I/O 操作。
  • 如果失败,返回值为 -1,并设置全局变量 errno 表示出错的原因。

示例

#include <fcntl.h>
#include <stdio.h>
#include <errno.h>

int main() {
    int fd;
    fd = open("example.txt", O_WRONLY | O_CREAT, 0644);
    if (fd == -1) {
        perror("open");
        return 1;
    }
    // 可以在这里进行文件写操作等
    close(fd);
    return 0;
}

lseek 函数

lseek 函数用于移动文件描述符指向文件中的位置。

语法

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);
  • fd 是文件描述符,通过 open 函数获取。
  • offset 是偏移量,可以是正数、负数或零,用来指定相对于 whence 的偏移量。
  • whence 用于确定 offset 是相对于文件开始位置、当前位置还是文件末尾位置,有三个可选值:
    • SEEK_SET:偏移量相对于文件开头
    • SEEK_CUR:偏移量相对于当前位置
    • SEEK_END:偏移量相对于文件末尾

返回值

  • 如果成功,lseek 函数返回从文件开头到新的文件位置的偏移量。
  • 如果失败,返回值为 -1,并设置全局变量 errno 表示出错的原因。

示例

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>

int main() {
    int fd;
    off_t offset;

    fd = open("example.txt", O_RDONLY);
    if (fd == -1) {
        perror("open");
        return 1;
    }

    // 设置文件偏移量到文件末尾
    offset = lseek(fd, 0, SEEK_END);
    if (offset == -1) {
        perror("lseek");
        close(fd);
        return 1;
    }

    printf("File size: %ld bytes\n", offset);

    close(fd);
    return 0;
}

这些函数是 C 语言中用于文件操作的基础函数,可以通过它们来进行文件的打开、关闭、读写以及定位操作。

下面是一个操作文件的例子

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

int main()
{
    char *buf = "你好啊 世界!"; 
    int fd = open("./file1", O_RDWR); // 尝试以读写模式打开名为 "file1" 的文件

    if (fd == -1)
    {
        printf("open file1 failed\n"); // 如果文件打开失败,输出错误消息
        fd = open("./file1", O_RDWR | O_CREAT, 0600); // 以读写模式和创建标志创建名为 "file1" 的新文件,文件权限为 0600
        if (fd > 0)
        {
            printf("create file1 success!\n"); // 如果成功创建文件,输出成功消息
        }
    }
    printf("open success: fd = %d\n", fd); // 打印文件描述符



    int write_num = write(fd, buf, strlen(buf)); // 向文件写入内容,返回写入的字节数
    if (write_num != -1)
    {
        printf("write %d bytes to file\n", write_num); // 打印成功写入的字节数
    }

	off_t offset = -21; // 设置偏移量为负数
    lseek(fd, -21, SEEK_CUR); // 在当前位置偏移 -21 个字节

	// 读取数据
	char *temp = (char*)malloc(sizeof(char) * write_num + 1);
	read(fd,temp,100);
	printf("%s\n",temp);


	close(fd); // 关闭文件
    
    return 0;
}

在这里插入图片描述

参考文章

推荐文章:Linux 文件基本属性

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

卷积神经网络 反向传播

误差的计算 softmax 经过softmax处理后所有输出节点概率和为1 损失&#xff08;激活函数&#xff09; 多分类问题&#xff1a;输出只可能归于某一个类别&#xff0c;不可能同时归于多个类别。 误差的反向传播 求w的误差梯度 权值的更新 首先是更新输出层和隐藏层之间的权重…

oracle下载

前言&#xff1a; 官网上提供都是最新的什么19c 21c这些版本&#xff0c;我要的是 11g 12c 或者更老的 8i 9i 这些版本。 准备下载一个oracle12c 版本&#xff0c;但是找了很久&#xff0c;最终…详情请看下面 oracle 数据库版本介绍 Oracle数据库有多个长期支持版本&#x…

模式识别与机器学习-SVM(带软间隔的支持向量机)

SVM&#xff08;带软间隔的支持向量机&#xff09; 软间隔思想的由来软间隔的引入 谨以此博客作为复习期间的记录。 软间隔思想的由来 在上一篇博客中&#xff0c;回顾了线性可分的支持向量机,但在实际情况中&#xff0c;很少有完全线性可分的情况&#xff0c;大部分线性可分…

OpenHarmony城市技术论坛武汉站:探索大模型时代的终端操作系统创新

2023年12月23日下午,OpenHarmony城市技术论坛(以下简称“技术论坛”)——第6期(武汉站)于华中科技大学梧桐语问学中心明德报告厅圆满举办。本次技术论坛聚焦“大模型时代的系统软件”,旨在探索AI大模型在终端操作系统领域的创新趋势和挑战。论坛从“终端操作系统十大技术挑战”…

事务管理解析:掌握Spring事务的必备技能!

AOP事务管理 1.1 Spring事务简介1.1.1 相关概念介绍1.1.2 转账案例-需求分析1.1.3 转账案例-环境搭建步骤1:准备数据库表步骤2:创建项目导入jar包步骤3:根据表创建模型类步骤4:创建Dao接口步骤5:创建Service接口和实现类步骤6:添加jdbc.properties文件步骤7:创建JdbcConfig配置…

相机内参标定理论篇------相机模型选择

相机种类&#xff1a; 当拿到一款需要标定内参的相机时&#xff0c;第一个问题就是选择那种的相机模型。工程上相机类型的划分并不是十分严格&#xff0c;一般来说根据相机FOV可以把相机大概分为以下几类&#xff1a; 长焦相机&#xff1a;< 标准相机&#xff1a;~&…

某验第四代滑块逆向快速破解

本期地址如下&#xff0c;使用base64解码获得网址 aHR0cHM6Ly9ndDQuZ2VldGVzdC5jb20v 破解某验&#xff0c;某盾已经是司空见惯的事情了&#xff0c;网上也有很多资料查阅&#xff0c;但是大多数都是繁琐、冗长&#xff0c;本文以最直接快速理解的方法讲解&#xff0c;稍微认真…

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理

1、前言 今天将和你一起探讨Java虚拟机&#xff08;JVM&#xff09;的性能调优。 JVM算是面试中的高频问题了&#xff0c;通常情况下总会有人问到&#xff1a;请你讲解下 JVM 的内存模型&#xff0c;JVM 的 性能调优做过&#xff1f; 2、为什么 JVM 在 Java 中如此重要 首…

IT安全:实时网络安全监控

了解庞大而复杂的网络环境并非易事&#xff0c;它需要持续观察、深入分析&#xff0c;并对任何违规行为做出快速反应。这就是为什么实时网络安全监控工具是任何组织 IT 安全战略的一个重要方面。 网络攻击和合规性法规是 IT 安全的两个主要驱动因素。同时&#xff0c;数据泄露…

LaTeX论文排版

LaTeX论文排版 LaTeX 简介与使用为什么选择使用LaTeX进行论文排版&#xff1f;LaTeX下载与安装LaTeX环境安装——TeX Live(Windows、Linux)安装IDE——TeXstudio LaTeX软件界面 BIT-thesis模板BIT-Thesis&#xff1a;主控文件demo.tex&#xff1a; 公式、图片、表格的排版使用L…

c语言用四种方式求解成绩之中最高分和最低分的差值

文章目录 一&#xff0c;题目二&#xff0c;方法1&#xff0c;方法一2&#xff0c;方法二3&#xff0c;方法三4&#xff0c;方法四 三&#xff0c;示例结果 一&#xff0c;题目 最高分最低分之差 输入n个成绩&#xff0c;换行输出n个成绩中最高分数和最低分数的差 输入 : 两行…

安防视频监控系统EasyCVR实现H.265视频在3秒内起播的注意事项

可视化云监控平台/安防视频监控系统EasyCVR视频综合管理平台&#xff0c;采用了开放式的网络结构&#xff0c;可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级联、磁盘阵列存储、视频集中存储、云存储等丰富的视频能力&#xff0c;同时…

Java中XML的解析

1.采用第三方开元工具dom4j完成 使用步骤 1.导包dom4j的jar包 2.add as lib.... 3.创建核心对象, 读取xml得到Document对象 SAXReader sr new SAXReader(); Document doc sr.read(String path); 4.根据Document获取根元素对象 Element root doc.getRootElement(); …

Bean 生命周期 和 SpringMVC 执行过程

这里简单记录下 Bean 生命周期的过程&#xff0c;方便自己日后面试用。源码部分还没看懂&#xff0c;这里先贴上结论 源码 结论

Spring Boot 中的虚拟线程

在本文中&#xff0c;我将讨论 Spring Boot 中的虚拟线程。 什么是虚拟线程&#xff1f; 虚拟线程作为 Java 中的一项功能引入&#xff0c;旨在简化并发性。 Virtual threads 是 轻量级的线程&#xff0c;由 Java Virtual Machine 而不是操作系统管理。它们被设计为易于使用且…

Apache Flink连载(十八):Flink On Yarn运行原理及环境准备

🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录 1. Flink On Yarn运行原理…

Final Cut 视频剪辑快速入门,小白上手视频课的制作

本文是一个快速入门教程&#xff0c;如果您是0视频处理基础&#xff0c;又想录制网课或是一些对效果要求不高的视频那么这篇教程足够使用了。 本文主要用Final Cut处理视频课&#xff0c;本文是笔者在制作视频课过程中逐渐摸索的&#xff0c;如果您想制作一些比较专业的视频&a…

docker学习(二十一、network使用示例container、自定义)

文章目录 一、container应用示例1.需要共用同一个端口的服务&#xff0c;不适用container方式2.可用示例3.停掉共享源的容器&#xff0c;其他容器只有本地回环lo地址 总结 二、自定义网络应用示例默认bridge&#xff0c;容器间ip通信默认bridge&#xff0c;容器间服务名不通 自…

SpringBoot 3.2.0 基于Logback定制日志框架

依赖版本 JDK 17 Spring Boot 3.2.0 工程源码&#xff1a;Gitee 日志门面和日志实现 日志门面&#xff08;如Slf4j&#xff09;就是一个标准&#xff0c;同JDBC一样来制定“规则”&#xff0c;把不同的日志系统的实现进行了具体的抽象化&#xff0c;只提供了统一的日志使用接…

C语言实验1:C程序的运行环境和运行C程序的方法

一、算法原理 这是学C语言的入门&#xff0c;并不需要很高深的知识&#xff0c;一个hello world 或者一个简单的加法即可 二、实验要求 了解所用的计算机系统的基本操作方法&#xff0c;学会独立使用该系统。 了解在该系统上如何编辑、编译、连接和运行一个C程序。 通过运…