当前位置: 首页 > news >正文

Linux文件基本操作

Linux 的设计哲学

在 Linux 中,一切皆文件!

什么是文件?

文件是具有永久存储性,按特定字节顺序组成的命名数据集

文件可分为:文本文件,二进制文件

文本文件:每个文件存放一个 ASCII 码

  • 存储量大,速度慢,便于对字符操作

二进制文件:数据按照在内存中的存储形式原样存放

  • 存储量小,速度快,便于存放中间结果

Linux 文件编程

在 Linux 中,除了常规文件,目录,设备,管道等,也属于文件

ASCII C 文件编程

标准 C 文件接口建立于 Linux 原生文件接口之上,使用缓冲区机制提高效率

缓冲区是一片特殊的内存空间,用于暂存文件中的数据

  • 读:一次性将大量的数据读入缓冲区 (后续再从缓冲区中拿数据)
  • 写:可先把数据写入输入缓冲区 (缓冲区满之后再把数据一次性写入文件)
  • 缓冲区的引入是为了避免频繁的磁盘操作,提高文件读写的整体效率

深入 ASCII C 文件编程

由于引入了缓冲区,ASCII C 文件编程是一种基于数据流的编程

ASCII C 文件编程接口

ASCII C 文件打开模式

文本文件写示例

ASCII C 文件 "读写移动指针"

int fseek(FILE* stream, long offset, int whence);

  • 移动文件读写指针,whence => SEEK_SET,SEEK_END,SEEK_CUR

long ftell(FILE* stream);

  • 获取当前读写指针的位置 (对于文件起始位置)

void rewind(FILE* stream);

  • 将读写指针置于文件起始位置,(void)fseek(stream, 0L, SEEK_SET)

二进制文件读写示例

ASCII C 文件编程初体验

test1.c


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>int main() 
{FILE* fp = NULL;char student[50] = {0}; int i = 0;if( (fp = fopen("input.txt", "w")) == NULL ){perror("open file error...\n");exit(1);}for(i=0; i<3; i++){printf("input name:");scanf("%s", student);fputs(student, fp);fputs("\n", fp);}fclose(fp);return 0;
}

第 13 行,我们以写的方式打开一个文本文件

第 23 行,通过 fputs(...) 将字符串写入到文本文件中

程序运行结果如下图所示:

test2.c

#include <stdio.h>
#include <stdlib.h>#define N   3struct student
{long num;char name[16];int age;
};int main()
{int i = 0;struct student s = {0};FILE* fp = NULL;if( (fp = fopen("student.dat", "wb+")) == NULL ){perror("open file error...\n");exit(1);}for(i=0; i<N; i++){printf("Number: %d\n", i + 1);printf("ID:");scanf("%ld", &s.num);printf("Name:");scanf("%s", s.name);printf("Age:");scanf("%d", &s.age);printf("\n");fwrite(&s, sizeof(s), 1, fp);}rewind(fp);for(i=0; i<N; i++){fread(&s, sizeof(s), 1, fp);printf("%ld %s %d\n", s.num, s.name, s.age);}fclose(fp);return 0;
}

第 19 行,我们以写入并新建文件的方式打开一个二进制文件

第 25 - 37 行,我们通过 scanf 来填充结构体的内容,并通过 fwrite 写入到二进制文件中

由于文件读写指针会在我们进行文件写入操作后,偏移位置在文件的末尾,所以在接下来我们需要读取文件内容的时候,可以使用 rewind(...) 函数,将文件读写指针偏移到文件的起始位置处,再进行读取

程序运行结果如下图所示:

ASCII 文件缓冲区类型

全缓冲区:默认缓冲器大小为 BUFSIZ,具体大小与系统相关

  • 缓冲区满 或 调用 fflush() 才通过系统调用将数据写入磁盘 (设备)

行缓冲区:默认缓冲区大小为 128 字节,具体大小与系统有关

  • 遇见 换行符 或 缓冲区满 或 调用 fflush() 后通过系统调用将数据写入磁盘 (设备)

无缓冲区:不对数据进行缓冲

  • 相当于直接使用系统调用 write(),数据立即写入磁盘 (设备)

自定义文件缓冲区

缓冲区代码示例

文件缓冲区编程实验

test3.c


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>int main() 
{FILE* fp = NULL;char buf[128] = {0}; char* ps = "Delphi\nTang";if( (fp = fopen("input.txt", "w")) == NULL ){perror("open file error...\n");exit(1);}setvbuf(fp, buf, _IOLBF, sizeof(buf));fwrite(ps, sizeof(*ps), strlen(ps), fp);printf("ps = %s\n", buf);fclose(fp);return 0;
}

第 19 行,我们通过 setvbuf(...) 函数将 input.txt 这个文件的缓冲类型设置为行缓冲,缓冲区为我们定义的 buf,缓冲区大小为 128 字节

第 21 行,我们通过 fwrite(...) 将字符串写入到文件中,由于我们设置了行缓冲,数据会先写入到缓冲区中,当遇到换行符后,会将缓冲区的 "Delphi" 字符串写入到文件中,字符串 "Tang" 还暂存在缓冲区中

第 25 行,我们调用了 fclose(...),把缓冲区中的字符串 "Tang" 也写入到文件中

程序运行结果如下图所示:

缓冲区的内容为 "Tanghi",是因为 "hi" 为脏数据,是将 "Delphi" 写入到缓冲区时保留下来的

test4.c


#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <memory.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>struct student
{long num;char name[16];int age;
};int main(int argc, char* argv[]) 
{FILE* fp = NULL;char buf[BUFSIZ] = {0};struct student s = {999, "tang", 888};struct student* ps = NULL;if( (fp = fopen("input.txt", "w")) == NULL ){printf("open file error: %d...\n", __LINE__);exit(1);}printf("BUFSIZ = %d\n", BUFSIZ);setvbuf(fp, buf, _IOFBF, sizeof(buf));fwrite(&s, sizeof(s), 1, fp);fclose(fp);ps = (void*)buf;printf("num = %ld,  name = %s,  age = %d\n", ps->num, ps->name, ps->age);/if( (fp = fopen("input.txt", "r")) == NULL ){printf("open file error: %d...\n", __LINE__);exit(2);}setvbuf(fp, buf, _IOFBF, sizeof(buf));memset(&s, 0, sizeof(s));memset(buf, 0, sizeof(buf));fread(&s, sizeof(s), 1, fp);printf("num = %ld,  name = %s,  age = %d\n", s.num, s.name, s.age);fclose(fp);ps = (void*)buf;printf("num = %ld,  name = %s,  age = %d\n", ps->num, ps->name, ps->age);return 0;
}

第 31 行,打印系统预定义的文件默认缓冲区大小的宏

第 33 行,设置文件缓冲区为全缓冲

第 35 行,我们将结构体 s 的内容写入到文件中,由于设置的是全缓冲,写入的结构体大小没有超过缓冲区大小,所以会先将数据暂存在缓冲区 buf 中

第 37 行,关闭文件,会将缓冲区暂存的数据写入到文件中去

程序运行结果如下图所示:

相关文章:

Linux文件基本操作

Linux 的设计哲学 在 Linux 中&#xff0c;一切皆文件&#xff01; 什么是文件&#xff1f; 文件是具有永久存储性&#xff0c;按特定字节顺序组成的命名数据集 文件可分为&#xff1a;文本文件&#xff0c;二进制文件 文本文件&#xff1a;每个文件存放一个 ASCII 码 存储…...

React 路由导航与传参详解

随着单页面应用&#xff08;SPA&#xff09;已经成为主流。React 作为最流行的前端框架之一&#xff0c;提供了强大的路由管理工具 react-router-dom&#xff0c;帮助开发者轻松实现页面导航和传参。本文将详细介绍如何使用 react-router-dom 构建路由导航、传参以及嵌套路由的…...

C#面试常考随笔6:ArrayList和 List的主要区别?

在 C# 中&#xff0c;ArrayList和List<T>&#xff08;泛型列表&#xff09;都可用于存储一组对象。推荐优先使用List<T>&#xff0c;因为它具有更好的类型安全性、性能和语法简洁性&#xff0c;并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...

C#分页思路:双列表数据组合返回设计思路

一、应用场景 需要分页查询&#xff08;并非全表查载入物理内存再筛选&#xff09;&#xff0c;返回列表1和列表2叠加的数据时 二、实现方式 列表1必查&#xff0c;列表2根据列表1的查询结果决定列表2的分页查询参数 三、示意图及其实现代码 1.示意图 黄色代表list1的数据&a…...

中科大:LLM检索偏好优化应对RAG知识冲突

&#x1f4d6;标题&#xff1a;RPO: Retrieval Preference Optimization for Robust Retrieval-Augmented Generation &#x1f310;来源&#xff1a;arXiv, 2501.13726 &#x1f31f;摘要 &#x1f538;虽然检索增强生成&#xff08;RAG&#xff09;在利用外部知识方面表现出…...

知识库管理系统提升企业知识价值与工作效率的实践路径分析

内容概要 知识库管理系统在企业发展中的重要性日益凸显&#xff0c;尤其是在信息爆炸的时代。现代企业需要有效地管理和利用自身知识资产&#xff0c;以提升整体效率和竞争力。本文旨在探讨知识库管理系统的应用实践&#xff0c;围绕其在信息整理、知识共享及决策支持等方面的…...

中文输入法方案

使用了三年的自然码双拼&#xff0c;毫无疑问是推荐使用双拼输入法。 三年积累下来的习惯是&#xff1a; 1 自然码方案 2 空格出字 字母选字 直到如今&#xff0c;想要做出改变&#xff0c;是因为这样的方案带来的痛点&#xff1a; 1 使用空格出字就无法使用辅助码&#…...

《AI芯片:如何让硬件与AI计算需求完美契合》

在人工智能飞速发展的今天&#xff0c;AI芯片已成为推动这一领域前行的关键力量。从智能语音助手到自动驾驶汽车&#xff0c;从图像识别技术到复杂的自然语言处理&#xff0c;AI芯片的身影无处不在。它就像是人工智能的“超级大脑”&#xff0c;以强大的计算能力支撑着各种复杂…...

AlertDialog组件的功能与用法

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了Dismissible Widget相关的内容,本章回中将介绍AlertDialog Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们介绍的AlertDialog是指程序中弹出的确认窗口&#xff0c;其实我们在上一章回中删除…...

【Python百日进阶-Web开发-FastAPI】Day813 - FastAPI 响应模型

文章目录 一、返回与输入相同的数据二、添加输出模型三、在文档中查看四、响应模型编码参数4.1 使用 response_model_exclude_unset 参数4.1.1 默认值字段有实际值的数据4.1.2 具有与默认值相同值的数据4.2 response_model_include 和 response_model_exclude4.2.1 使用 list 而…...

洛谷U525376 信号干扰 (判断多个区间是否有重叠)

U525376信号干扰 题目描述 有 n n n 座信号塔&#xff0c;第 i i i 座信号塔的信号将覆盖区间 [ l i , r i ] [l_i,r_i] [li​,ri​]。 若某个点被超过一座信号塔的信号覆盖&#xff0c;则在该点会产生信号干扰。 对于信号塔区间 [ a , b ] [a,b] [a,b]&#xff0c;若建…...

ESP32-S3模组上跑通esp32-camera(35)

接前一篇文章:ESP32-S3模组上跑通esp32-camera(34) 一、OV5640初始化 2. 相机初始化及图像传感器配置 上一回继续对reset函数的后一段代码进行解析。为了便于理解和回顾,再次贴出reset函数源码,在components\esp32-camera\sensors\ov5640.c中,如下: static int reset…...

Java进阶(二):Java设计模式

目录 设计模式 一.建模语言 二.类之间的关系 1.依赖关系 2.关联关系 3.聚合关系 4.组合关系 5.继承关系 6.实现关系 三.面向对象设计原则 单一职责原则 开闭原则 里氏替换原则 依赖倒置 接口隔离原则 迪米特原则 组合/聚合(关联关系)复用原则 四.23种设计模式…...

DeepSeek R1:中国AI黑马的崛起与挑战

文章目录 技术突破&#xff1a;从零开始的推理能力进化DeepSeek R1-Zero&#xff1a;纯RL训练的“自我觉醒”DeepSeek R1&#xff1a;冷启动与多阶段训练的平衡之道 实验验证&#xff1a;推理能力的全方位跃升基准测试&#xff1a;超越顶尖闭源模型蒸馏技术&#xff1a;小模型的…...

抗体人源化服务如何优化药物的分子结构【卡梅德生物】

抗体药物作为一种重要的生物制药产品&#xff0c;已在癌症、免疫疾病、传染病等领域展现出巨大的治疗潜力。然而&#xff0c;传统的抗体药物常常面临免疫原性高、稳定性差以及治疗靶向性不足等问题&#xff0c;这限制了其在临床应用中的效果和广泛性。为了克服这些问题&#xf…...

AndroidCompose Navigation导航精通2-过渡动画与路由切换

目录 前言路由切换NavControllerBackStackEntry过渡动画过渡原理缩放动画渐隐动画滑动动画动画过渡实战前言 在当今的移动应用开发中,导航是用户与应用交互的核心环节。随着 Android Compose 的兴起,它为开发者提供了一种全新的、声明式的方式来构建用户界面,同时也带来了更…...

基于微信小程序的社团活动助手php+论文源码调试讲解

4 系统设计 微信小程序社团微信小程序的设计方案比如功能框架的设计&#xff0c;比如数据库的设计的好坏也就决定了该系统在开发层面是否高效&#xff0c;以及在系统维护层面是否容易维护和升级&#xff0c;因为在系统实现阶段是需要考虑用户的所有需求&#xff0c;要是在设计…...

WebSocket 详解:全双工通信的实现与应用

目录 一、什么是 WebSocket&#xff1f;&#xff08;简介&#xff09; 二、为什么需要 WebSocket&#xff1f; 三、HTTP 与 WebSocket 的区别 WebSocket 的劣势 WebSocket 的常见应用场景 WebSocket 握手过程 WebSocket 事件处理和生命周期 一、什么是 WebSocket&#xf…...

漏洞修复:Apache Tomcat 安全漏洞(CVE-2024-50379) | Apache Tomcat 安全漏洞(CVE-2024-52318)

文章目录 引言I Apache Tomcat 安全漏洞(CVE-2024-50379)漏洞描述修复建议升级Tomcat教程II Apache Tomcat 安全漏洞(CVE-2024-52318)漏洞描述修复建议III 安全警告引言 解决方案:升级到最新版Tomcat https://blog.csdn.net/z929118967/article/details/142934649 service in…...

智慧园区系统分类及其在提升企业管理效率中的创新应用探讨

内容概要 智慧园区的概念已经逐渐深入人心&#xff0c;成为现代城市发展中不可或缺的一部分。随着信息技术的飞速发展和数字化转型的不断推进&#xff0c;一系列智慧园区管理系统应运而生。这些系统不仅帮助企业提高了管理效率&#xff0c;还在多个方面激发了创新。 首先&…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

(十)学生端搭建

本次旨在将之前的已完成的部分功能进行拼装到学生端&#xff0c;同时完善学生端的构建。本次工作主要包括&#xff1a; 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

Linux-07 ubuntu 的 chrome 启动不了

文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了&#xff0c;报错如下四、启动不了&#xff0c;解决如下 总结 问题原因 在应用中可以看到chrome&#xff0c;但是打不开(说明&#xff1a;原来的ubuntu系统出问题了&#xff0c;这个是备用的硬盘&a…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

如何配置一个sql server使得其它用户可以通过excel odbc获取数据

要让其他用户通过 Excel 使用 ODBC 连接到 SQL Server 获取数据&#xff0c;你需要完成以下配置步骤&#xff1a; ✅ 一、在 SQL Server 端配置&#xff08;服务器设置&#xff09; 1. 启用 TCP/IP 协议 打开 “SQL Server 配置管理器”。导航到&#xff1a;SQL Server 网络配…...

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南

在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...

WEB3全栈开发——面试专业技能点P4数据库

一、mysql2 原生驱动及其连接机制 概念介绍 mysql2 是 Node.js 环境中广泛使用的 MySQL 客户端库&#xff0c;基于 mysql 库改进而来&#xff0c;具有更好的性能、Promise 支持、流式查询、二进制数据处理能力等。 主要特点&#xff1a; 支持 Promise / async-await&#xf…...