系统方面对文件的打开,读写,关闭

news2024/12/25 13:22:33

系统方面对文件的操作

    • 1. 系统方面打开文件的函数
    • 2. 系统方面对文件的写入
    • 3. 系统方面对文件的读取
    • 4. 关闭文件close

在这里插入图片描述

1. 系统方面打开文件的函数

open函数得到一个指定文件的文件描述符,如果出现错误则返回-1。open函数需要传入一个文件路径和操作模式,调用会返回一个整型的文件描述符。
在这里插入图片描述
在Linux系统中,open函数主要作用就是打开和创建文件,可以根据参数来定制需要的文件的属性和用户权限等各种参数。flag参数相当于是宏,并且是可选的,用于设置打开文件的模式。flag参数的取值如下:

O_RDONLY: 只读模式
O_WRONLY: 只写模式
O_RDWR : 读写模式
O_NONBLOCK: 非阻塞模式
O_APPEND: 追加模式
O_CREAT: 创建并打开一个新文件
O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
O_EXCL: 如果指定的文件存在,返回错误

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

int main()    
{    
    int fd = open("log.txt", O_WRONLY);//只写入                                                                             
    printf("fd: %d, errror: %d, errstring: %s\n", fd, errno, strerror(errno));//打印文件描述符,错误码,错误信息    
    close(fd);    
                                                                         
    return 0;                                                                
}  

因为没有创建文件,没有log.txt文件,所以打开文件失败,文件描述符为-1。
在这里插入图片描述

然后将上面这句代码进行改动:int fd = open(“log.txt”, O_CREAT | O_WRONLY); 进行创建和写入。

在这里插入图片描述
可以看到文件描述符为3(open成功),但是log.txt这个文件的权限是乱的,可以用chmod 0XXX log.txt 进行修改,也可以用open修改。
在Linux系统中,umask是一个用于设置文件和目录默认权限的命令。每个文件和目录都有一组权限,包括读、写和执行权限。umask值是由三个八进制数字表示的。第一个数字表示所有者的权限,第二个数字表示组的权限,第三个数字表示其他人的权限。每个数字都可以是0到7之间的任何数字。所以在test.c文件中,可以将umask设为0,系统下的umask和用户设定的umask,程序用哪个采用就近原则。

#include <stdio.h>    
#include <errno.h>    
#include <string.h>    
#include <unistd.h>    
#include <sys/types.h>    
#include <sys/stat.h>    
#include <fcntl.h>    
    
int main()    
{    
	umask(0);
    int fd = open("log.txt",O_CREAT | O_WRONLY, 0666);                                                              
    printf("fd: %d, errror: %d, errstring: %s\n", fd, errno, strerror(errno));    
    close(fd);    
    
    return 0;    
}    

在这里插入图片描述

2. 系统方面对文件的写入

write函数是基于Linux系统中的一项函数调用,主要用于在打开/创建的文件中写入数据。 write()会把参数buf所指的内存写入count个字节到参数fd所指的文件内。 write函数包含的头文件为 #include <unistd.h>。
write()函数的三个参数分别为:文件描述符fd,缓冲区buf和写入字节数count。 当有错误发生时则返回-1,错误代码存入errno中。
在这里插入图片描述
要想在文件中写数据,write()函数需要3个参数,fd,count易得,还需要一个缓冲区buf,这个缓冲区里面有给文件中写入的数据,给缓冲区中写入数据,需用到snprintf()函数。
snprintf()是一个C语言标准库函数,它的三个参数分别为:缓冲区buf,缓冲区大小size和格式化字符串format。 如果格式化后的字符串长度超过了size,则会截断超出部分。用于格式化输出字符串,并将结果写入到指定的缓冲区。与sprintf()不同的是,snprintf()会限制输出的字符数,避免缓冲区溢出。
在这里插入图片描述

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

int main()
{
    umask(0);
    int fd = open("log.txt",O_CREAT | O_WRONLY, 0666);
    printf("fd: %d, errror: %d, errstring: %s\n", fd, errno, strerror(errno));
    //写入
    const char *msg = "hello";
    int cnt = 3;
    while (cnt)
    {
        char buf[128];
        snprintf(buf, sizeof(buf), "%s, %d\n", msg, cnt);

        write(fd, buf, strlen(buf) + 1);
        --cnt;
    }
    close(fd);

    return 0;
}

这里有一个小细解,strlen求的是‘\0’之前字符串的长度,众所周知,c语言规定‘\0’用于判断字符串的结尾,而打印的时候需不需要带上‘\0’?上述代码是带上’\0’的,写入结果如下所示:
在这里插入图片描述
可以看到文件中有^@符号,这些是文件对‘\0’ 的处理,所以对文件进行写入字符串时,不需要带‘\0’,因为’\0’是c语言规定的,不是文件规定的。
当再次向文件中写入,会出现预料之外的结果(如下),这是因为上述代码open函数中的flag参数的原因,O_CREAT | O_WRONLY只是进行创建并打开一个新文件和只写模式,还需要O_TRUNC,如果是追加则需要O_APPEND。
在这里插入图片描述
flag参数的取值如下:

O_RDONLY: 只读模式
O_WRONLY: 只写模式
O_RDWR : 读写模式
O_NONBLOCK: 非阻塞模式
O_APPEND: 追加模式
O_CREAT: 创建并打开一个新文件
O_TRUNC: 打开一个文件并截断它的长度为零(必须有写权限)
O_EXCL: 如果指定的文件存在,返回错误

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

int main()
{
    umask(0);
    int fd = open("log.txt",O_CREAT | O_WRONLY | O_TRUNC, 0666);
    printf("fd: %d, errror: %d, errstring: %s\n", fd, errno, strerror(errno));
    
    const char *msg = "hello";
    int cnt = 3;
    while (cnt)
    {
        char buf[128];
        snprintf(buf, sizeof(buf), "%s, %d\n", msg, cnt);

        write(fd, buf, strlen(buf));
        --cnt;
    }
    close(fd);

    return 0;
}

3. 系统方面对文件的读取

在这里插入图片描述

read()函数是基于Linux系统中的一项函数调用,主要用于从文件描述符fd所指的文件中读取count个字节到缓冲区buf中。 read()函数包含的头文件为 #include <unistd.h>。

read()函数的三个参数分别为:文件描述符fd,缓冲区buf和读取字节数count。 当有错误发生时则返回-1,错误代码存入errno中。

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

int main()
{
    int fd = open("log.txt", O_RDONLY); //只读模式
    char buf[1024];
    size_t n = read(fd, buf, sizeof(buf) - 1);
    if (n > 0)
    {
        buf[n] = '\0';
        printf("%s\n",buf);
    }
	close(fd);
	
	return 0;

对于文件的读写,系统和c语言分别对‘\0’的处理是不一样的,所以在进行字符串到文件的写入或者是从文件中读取数据到c语言中,‘\0’就需要自己处理。如上,在读取字符串的时候,读取的字节数的大小减1,这个位置就准备用来放‘\0’。并且从文件中读取数据,不能进行按行读取,只能进行整体读取(或者是按字节数读取),而c语言按行读取时c语言内部进行了特殊处理。 读取结果如下:
在这里插入图片描述
所以c标准库里的fopen,fclose,fwrite,fread等函数都是将系统中的open,close,write,read等函数进行封装,fopen,fclose,fwrite,fread调用的就是系统中的open,close,write,read等函数。
open()函数是一个系统调用,返回的是文件句柄,文件的句柄是文件在文件描述副表里的索引。而fopen()是C的库函数,返回的是一个指向文件结构的指针。这两个函数的区别主要在于:

  1. open()函数可以打开任何类型的文件,而fopen()函数只能打开文本文件。
  2. open()函数返回一个文件描述符,而fopen()函数返回一个指向文件结构的指针。
  3. open()函数不需要stdio.h头文件,而fopen()函数需要stdio.h头文件。

close()函数和fclose()函数都是用于关闭文件的函数,它们之间的区别:

  1. close()函数是一个系统调用,而fclose()函数是C的库函数。
  2. close()函数需要一个文件描述符作为参数,而fclose()函数需要一个指向文件结构的指针作为参数。
  3. close()函数不会刷新缓冲区,而fclose()函数会刷新缓冲区。
  4. close()函数不会返回任何值,而fclose()函数会返回一个整数值。

4. 关闭文件close

在Linux中,close()函数是一个系统调用,用于关闭文件描述符,以便它不再引用任何文件并可以被重用。如果文件描述符是与记录锁定相关联的,则会删除这些锁定。如果文件描述符是与打开的文件相关联的,则会释放该文件所占用的资源。如果成功执行,则返回0,否则返回-1,并将失败原因记录在errno中。
在这里插入图片描述
close()函数的语法如下:


#include <unistd.h>

int close(int fd);

c语言对文件的打开和读写

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

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

相关文章

高德地图AMap.MouseTool插件多次测距不能清除bug

AMap.MouseTool插件是一个很有用的插件&#xff0c;可以在地图上画折线测量距离&#xff0c;也可以在地图上画区域测量面积&#xff0c;这些在客户的一些高级需求里经常出现&#xff0c;最近使用出现了bug&#xff0c;此bug在官网的示例里也能重现 官网demo上重现步骤如下图&a…

剑指 Offer 58 - I. 翻转单词顺序

剑指 Offer 58 - I. 翻转单词顺序 题目&#xff1a; 输入一个英文句子&#xff0c;翻转句子中单词的顺序&#xff0c;但单词内字符的顺序不变。为简单起见&#xff0c;标点符号和普通字母一样处理。例如输入字符串"I am a student. “&#xff0c;则输出"student. a …

Spring Tool Suite(STS)初始化配置记录

目录 1.前言 2.STS安装 3.STS配置 3.1.SpringToolSuite4.ini 3.2、配置maven 3.3.配置jdk 3.4.全局编码设置 3.5.字体配置 3.6.设置自动提示 4. Spring插件 4.1.MyBatipse--mybatis插件 4.2.Spark Builder Generator 4.3.Properties Editor 4.4.Checkstyle 4.5.…

【MySQL】数据库的基本操作

&#x1f3e0; 大家好&#xff0c;我是 兔7 &#xff0c;一位努力学习C的博主~&#x1f4ac; &#x1f351; 如果文章知识点有错误的地方&#xff0c;请指正&#xff01;和大家一起学习&#xff0c;一起进步&#x1f440; &#x1f680; 如有不懂&#xff0c;可以随时向我提问&…

Smoothieware_best-for-pnp 工程文件编译选项含义整理

文章目录 Smoothieware_best-for-pnp 工程文件编译选项含义整理概述arm-none-eabi-gcc 的编译选项含义整理 - S(汇编)文件arm-none-eabi-gcc 的编译选项含义整理 - C文件arm-none-eabi-gcc 的编译选项含义整理 - CPP文件库的打包arm-none-eabi-gcc 的编译选项含义整理 - C文件 …

Python入门教程+项目实战-12.3节-使用字典进行格式化

目录 12.3.1 字符串的格式化 12.3.2 使用字典进行格式化 12.3.3 格式化操作方法的优缺点 12.3.4 知识要点 12.3.5 系统学习python 12.3.1 字符串的格式化 在9.4节介绍了字符串的格式化&#xff0c;我们先来回顾下字符串格式化的定义&#xff0c;以及主要的格式化方法&…

万字长文详述ClickHouse在京喜达实时数据的探索与实践 | 京东云技术团队

1 前言 京喜达技术部在社区团购场景下采用JDQFlinkElasticsearch架构来打造实时数据报表。随着业务的发展 Elasticsearch开始暴露出一些弊端&#xff0c;不适合大批量的数据查询&#xff0c;高频次深度分页导出导致ES宕机、不能精确去重统计&#xff0c;多个字段聚合计算时性能…

从零开始的python教程:全面又好用的学习资料

Hi&#xff0c;大家好&#xff0c;我是蛋糕 最近因为接连带过一些训练营和成长营&#xff0c;也是可以与各位小伙伴进行更多的讨论&#xff0c;发现各位小伙伴最近也是迫切的想要学习一些新的技能&#xff0c;其中呼声最高的可能就是Python了&#xff0c;当然理由也是很多啦&a…

LeetCode 84 柱状图中最大的矩形

题目&#xff1a; 给定n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xf…

职工人事管理系统_项目整合以及salary模块逻辑整理

项目&#xff1a; groupId 在所有项目中唯一标识您的项目。artifactId 是没有版本的 jar 的名称。Maven 中groupId 和artifactId 的主要区别在于&#xff0c;groupId 指定项目组的id&#xff0c;而artifactId 指定项目的id 配置完环境&#xff0c;如何测试自己的依赖安装完毕…

TDengine 成功“晋级” Percona Live 2023 银牌赞助商,开发者驻足关注

带着创新的数据技术走遍全球 这一次 陶建辉带着 TDengine 飞到了丹佛...... 2023 年 5 月 22-24 日&#xff0c;一年一度的开源数据库领域全球最具影响力峰会 Percona Live 2023 在丹佛技术中心万豪酒店举办。Percona Live 是全球持续举办最久的独立开源数据大会&#xff0c…

jsp测试题:

jsp测试选择题 题号答案1C2A3A4A5A6A7B8C9B10A11A12A13A14A15C 简答题&#xff1a; 1.在JSP中&#xff0c;<% int a 3; %>与<%! int b 3; %>中定义的变量有何不同&#xff1f;若要在某一JSP页面中定义一个方法void f()&#xff0c; 应用什么样的语法&#xff1…

社团管理系统

文章目录 社团管理系统一、项目演示二、项目介绍三、系统运行界面图四、系统部分功能截图五、部分代码展示六、底部获取源码 社团管理系统 一、项目演示 社团管理系统 二、项目介绍 基于SpringBoot2Vue的前后端分离的社团管理系统 前后端分离 前端开发 : Vue2 ElementUl 后…

“小白也能玩转Python数据分析,快速掌握技巧!

最近收到好几条私信&#xff0c;想要了解数据分析方面的学习教程。 Python如今势头很猛&#xff0c;但是结合市场环境来说&#xff0c;Python开发岗位的需求还是要低于其他后端语言&#xff0c;但是Python爬虫和数据分析的技能确是实实在在可以用到很多工作中去&#xff0c;所…

Linux 操作系统原理 — netfilter/iptables 流量处理框架

目录 文章目录 目录Netfilter 流量处理框架Netfilter 的实现原理Netfilter 的工作原理规则&#xff08;Rules&#xff09;链&#xff08;Chains&#xff09;表&#xff08;Tables&#xff09;数据包处理流程图 iptables CLIiptables-service指令应用查看规则添加规则删除规则修…

java按照模板导出pdf或者word

一、java按照模板导出pdf &#xff08;一&#xff09;制作模板 1、在word里制作模板 因为PDF常用的软件不支持编辑&#xff0c;所以先用Word工具&#xff0c;如WPS或者Office新建一个空白Word文档&#xff0c;里面制作出自己想要的样式。 2、 将Word转换成PDF形式 将设置好的W…

120G课程内容!龙讯旷腾为您的课题组打造专属空间

我们介绍了龙讯旷腾资源中心&#xff08;http://login.lonxun.com/login&#xff09;是一个知识管理与服务型的综合社区&#xff0c;但资源中心仅仅是一个简单的内容展示平台吗&#xff1f;对于高校课题组的教师和企业管理者来说&#xff0c;资源中心提供了多种辅助教学和建站功…

Ubuntu TDengine集群搭建

我这里用三台服务器搭建集群 1、如果搭建集群的物理节点上之前安装过TDengine先卸载清空&#xff0c;直接执行以下4条命令 rmtaos rm -rf /var/lib/taos rm -rf /var/log/taos rm -rf /etc/taos2、确保集群中所有主机开放端口 6030-6043/tcp&#xff0c;6060/tcp&#xff0c;…

Spring Boot 中如何使用 Spring Data MongoDB 来访问 MongoDB

Spring Boot 中如何使用 Spring Data MongoDB 来访问 MongoDB 简介 MongoDB 是一个流行的 NoSQL 数据库&#xff0c;其以灵活的数据模型和可扩展性而闻名。Spring Data MongoDB 是 Spring 框架的一个子项目&#xff0c;它提供了一种简单的方式来使用 MongoDB 数据库。在本文中…

ChatGPT工作提效之小鹅通二次开发批量API对接解决方案(学习记录同步、用户注册同步、权益订购同步、开发文档)

ChatGPT工作提效系列 ChatGPT工作提效之初探路径独孤九剑遇强则强ChatGPT工作提效之在程序开发中的巧劲和指令(创建MySQL语句、PHP语句、Javascript用法、python的交互)ChatGPT工作提效之生成开发需求和报价单并转为Excel格式 ChatGPT工作提效之小鹅通二次开发批量API对接解决…