细说文件操作
你好!感谢支持孔乙己的新作,本文就文件操作与大家分享我的思路。
希望能大佬们多多纠正及支持 !!!
个人主页:爱摸鱼的孔乙己-CSDN博客
目录
1.什么是文件
1.1.程序设计文件
1.1.1.程序文件
1.1.2.数据文件
1.2.二进制文件与文本文件
2.文件的打开及关闭
2.1.流和标准流
2.1.1.流(stream)
2.1.2.标准流
2.2.文件指针
2.3.文件的打开及关闭
2.4.文件的顺序读写
3.文件操作读写深入解析
3.1.fseek
3.2.ftell
3.3.rewind
3.4.feof
1.什么是文件
Leading ~~ 我们可以把文件看做一种用于存储信息的数据集合,可以是电子形式或纸质形式。在计算机中,文件通常由操作系统管理,保存用户的数据信息,文件可以包含文本、图像、音频、视频等各种数据。因此,我们有必要对文件进行各种处理,常见的文件操作包括创建、打开、读取、写入、关闭和删除等。
1.1.程序设计文件
从文件功能的角度来分类,我们一般所涉及的有两种文件,一种是程序文件,另一种是数据文件。当然,程序文件一般指的是计算机可执行代码的文件,这些代码通过编译或解释生成,并且程序文件通常用于执行特定的任务或功能。
1.1.1.程序文件
- 执行性:程序文件可以被操作系统直接执行,在运行时会将代码加载在内存中。
- 格式 :常见的程序文件格式包括可执行文件(如.exe 、.app等)和脚本文件(如.py 、.js、.sh等)。
- 内容 :程序文件的内容包含了指令和逻辑,用于控制计算机的行为。
- 开发工具 :程序文件通常是由编程语言的编译器或解释器实现的。
1.1.2.数据文件
- 不可执行性:数据文件本身不可以直接执行。
- 格式多样性:数据文件可以是文本文件(如 .txt、.csv)、二进制文件(如 .bin、.dat)、数据库文件(如 .db、.sqlite)等。
- 内容:数据文件的内容通常包括文本、数字、图像、音频、视频等多种类型的信息。
- 结构化和非结构化:数据文件可以是结构化的(如数据库)或非结构化的(如普通文本文件)。
程序文件主要用于开发和应用程序、工具和系统软件、或用于控制硬件设备和进行系统管理以及自动化任务和处理数据;数据文件主要用于存储用户信息、设置、文档和媒体文件、或用于应用程序的数据输入及输出,乃至进行数据分析、报表生成和数据迁移。
1.2.二进制文件与文本文件
数据在内存中以二进制的形式存储,不加转换的输出到外存的文件中,就是二进制文件,如果外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件。字符一律以ASCII形式存储,数值型数据可以用ASCII形式存储,或使用二进制形式存储。
2.文件的打开及关闭
2.1.流和标准流
2.1.1.流(stream)
流是一种数据传输的一种抽象,通常用于处理数据的输入和输出。流可以看作是数据的序列,可以是字节流(binary stream)或字符流(character stream)。根据数据的方向,流可以分为两种类型,一种是输入流:用于从外部源(如文件、网络、用户输入等)读取数据;另一种是输出流:用于将数据携入外部目标(如显示器、文件、网络连接等)。
流的主要特点包括:
- 顺序访问:数据以顺序的方式被读取或写入。
- 可打开和关闭:流在使用前需要被打开,使用后需要关闭,以释放资源。
- 缓冲:许多实现使用缓冲技术来提高性能,允许数据的块读取和写入。
2.1.2.标准流
标准流是操作系统层面定义的一种特殊流,通常是用于数据输和输出的通道。程序运行时,操作系统会提供以下三个流:
stdin(标准输⼊流) | 在⼤多数的环境中从键盘输⼊,scanf函数就是从标准输⼊流中读取数据。 |
stdout( 标准输出流) | ⼤多数的环境中输出⾄显⽰器界⾯,printf函数就是将信息输出到标准输出中。 |
stderr(标准错误流) | ⼤多数环境中输出到显⽰器界⾯。 |
2.2.文件指针
以上stdin、stdouot、stderr三个流的类型是FILE*,通常称为文件指针, 在C语言中,我们就是通过FILE*的文件指针进而维护流的各项操作。
每个文件在内存中开辟一个对应的文件信息区,用于存放文件的名字、文件状态及文件当前所在的位置。这些信息是保存在一个结构体变量中的,且该结构体类型命名为FILE。然后,我们定义一个指向FILE类型的指针变量ptr,指向某个文件的文件信息区(结构体变量),通过文件指针变量就能够间接查找与之关联的文件。
2.3.文件的打开及关闭
当我们编写程序时,在打开文件的同时,都会返回一个的FILE*的指针变量指向该文件,从而建立指针与文件的关系。并且,ANSIC规定使用fopen函数作为打开文件,fclose作为关闭文件。
//打开⽂件
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件
int fclose ( FILE * stream );
其中,mode是文件的打开模式。其中“r“与”w”分别为输入与输出数据,而“a”是向文本文件尾添加数据,当然,诸如“rb“和”wb“,其作用的便是二进制文件,等等。
2.4.文件的顺序读写
fread与fwrite比较适用于文件输入输出流,其余可以适用于所有输入流。
3.文件操作读写深入解析
3.1.fseek
fseek是C语言是一个标准库函数,用于在文件中进行随机访问,并且可以将文件指针定位至特定位置,以便进行读写操作。
//fseek
//根据⽂件指针的位置和偏移量来定位⽂件指针(⽂件内容的光标)。
1 int fseek ( FILE * stream, long int offset, int origin );
stream: 指向要操作的文件的指针,通常是通过 fopen 打开的文件。
offset: 偏移量,表示相对于 whence 的字节数。
origin: 确定偏移的起始位置,可以是以下常量之一:
SEEK_SET: 文件开头。
SEEK_CUR: 当前文件指针的位置。
SEEK_END: 文件的末尾。/* fseek example */
#include <stdio.h>int main ()
{FILE * pFile;pFile = fopen ( "example.txt" , "wb" );fputs ( "This is an apple." , pFile );fseek ( pFile , 9 , SEEK_SET );fputs ( " sam" , pFile );fclose ( pFile );return 0;
}
在使用fseek之前,确保文件已成功打开;如果目标位置超出了文件的实际大小,fseek可能会导致未定义的行为;在进行写入操作之前,确保文件模式允许写入(例如,使用”r+“或”w+“模式)。
3.2.ftell
ftell是C语言中的一个·标准库函数,用于获取当前文件在文件中的位置,并且它返回的是当前指针相对于文件开头的字节偏移量。
返回⽂件指针相对于起始位置的偏移量
1 long int ftell ( FILE * stream );/* ftell example : getting size of a file */#include <stdio.h>
int main ()
{FILE * pFile;long size;pFile = fopen ("myfile.txt","rb");if (pFile==NULL) perror ("Error opening file");else{fseek (pFile, 0, SEEK_END); // non-portablesize=ftell (pFile);fclose (pFile);printf ("Size of myfile.txt: %ld bytes.\n",size);}return 0;
}
成功时返回当前文件指针的偏移量(类型为 long
),在一些特定情况下,如果文件被错误地打开,或者文件指针经过某些非法操作,ftell
可能返回 -1
。
3.3.rewind
rewind是C语言中的一个标准库函数,用于将文件指针重置为文件的开头,使用起来非常简单且直观,通常用于将文件指针返回到起始位置,以便重新开始读取或写入文件内容。
让⽂件指针的位置回到⽂件的起始1 void rewind ( FILE * stream );/* rewind example */
#include <stdio.h>
int main ()
{int n;FILE * pFile;char buffer [27];pFile = fopen ("myfile.txt","w+");for ( n='A' ; n<='Z' ; n++)fputc ( n, pFile);rewind (pFile);fread (buffer,1,26,pFile);fclose (pFile);buffer[26]='\0';printf(buffer);return 0;
}
rewind
是一个简单且有效的方法来返回文件指针至开头。调用 rewind
也会清除与文件流关联的错误指示符,因此如果之前的读写操作发生了错误,错误状态会被重置。在使用 rewind
前,确保文件已成功打开,否则将导致未定义行为。
3.4.feof

相关文章:

细说文件操作
你好!感谢支持孔乙己的新作,本文就文件操作与大家分享我的思路。 希望能大佬们多多纠正及支持 !!! 个人主页:爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文…...

Vue3从零开始——掌握setup、ref和reactive函数的奥秘
文章目录 一、Vue 3 组合式 API 概述二、setup 函数的基本使用2.1 setup 函数的特点2.2 setup 函数的基本结构2.3 实现一个简单的小demo 三、ref 函数的功能和应用3.1 ref函数介绍3.2 基本使用3.2.1 定义ref数据3.2.2 修改响应式变量 3.3 使用ref函数实现计数器 …...
C语言练习--屏幕上打印九九乘法表
int main() { int i 0; for (i 1; i < 10; i) { int j 0; for (j 1; j <i; j) { printf(" %d*%d%2d", i, j, i * j); } printf("\n"); } return 0; }...

将tsx引入vue
按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx...

前端实现签字效果+合同展示
文章目录 获取一个高度会变的元素的高度获取元素设置的 transform适配手机transform-origin: 5% 0; 的原因修改后 签字效果取消el-dialog的头部边距为什么禁止界面滚动vue3 使用 nextTick实现效果 签字判断是横是竖canvas 去掉空白部分canvas裁剪图片最终完善代码,可…...
[AI Embedchain] 开始使用 - 快速开始
安装 首先安装 Python 包: pip install embedchain安装包后,根据您的偏好,您可以选择使用以下内容: 开源模型 本节提供了一个快速入门示例,展示了如何使用 Mistral 作为开源 LLM(大型语言模型ÿ…...
Linux网络协议.之 tcp,udp,socket网络编程(三).之多进程实现并发demon
一、fork创建进程,来实现多并发 这只是个demon,并不能用于实际项目,多进程,消耗太多资源。没有人这么玩 1、服务端代码: #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #in…...
Java线程(练习题)
Exercise 创建三个线程:一个线程打印 100个A,一个线程打印 100 个 B ,一个线程打印 100个C 输出效果:ABC ABC ABC…交替打印 package com.kane.exercise01;public class PrintABC implements Runnable {private static final Object lock …...

MySQL:初识数据库初识SQL建库
目录 1、初识数据库 1.1 什么是数据库 1.2 什么是MySQL 2、数据库 2.1 数据库服务&数据库 2.2 C/S架构 3、 初识SQL 3.1 什么是SQL 3.2 SQL分类 4、使用SQL 4.1 查看所有数据库 4.1.2 语句解析 4.2 创建数据库 4.2.1 if not exists校验 4.2.2 手动明确字符集…...

关于Redis的集群面试题
问题一:Redis的多数据库机制,了解多少? Redis支持多个数据库,并且每个数据库是隔离的不能共享,单机下的redis可以支持16个数据库(db0~db15);若在Redis Cluster集群架构下,则只有一个…...
带头双向循环链表(一)
今天我们来学习带头双向链表 带头双向循环链表的解释 带头双向链表顾名思义就是: 1、带了一个“头”在数据结构中的意思就是加了一个"哨兵位"。 2、这个链表是双向循环的链表即可以通过任意的节点访问它的上一个和下一个的节点也能通过链表的头直接访…...
深入理解Win32K.sys的工作原理
https://download.csdn.net/download/sitelist/89621815 Windows Resource Kits 2003.rar工具下载,因为有windows server 2003源代码,并可以编译成iso,所以对于研究windows系统很有帮助,上吗是2003的研究工具,不知道源…...

力扣面试经典算法150题:删除有序数组中的重复项
删除有序数组中的重复项 今天的题目是力扣面试经典150题中的数组的简单题: 删除有序数组中的重复项 题目链接:https://leetcode.cn/problems/remove-duplicates-from-sorted-array/description/?envTypestudy-plan-v2&envIdtop-interview-150 题目描述 给定一…...

文本加密工具类-支持MD5、SHA1、SHA256、SHA224、SHA512、SHA384、SHA3、RIPMD160算法
文本加密工具类 1.算法简介1.1 MD51.2 SHA-11.3 SHA-2(推荐使用)1.4 SHA-3(推荐使用)1.5 RIPEMD-160 2.工具类案例2.1POM导入2.2代码编写2.3 输出示例 1.算法简介 1.1 MD5 MD5 (Message-Digest Algorithm 5) 描述:M…...

LVS集群中的负载均衡技术
目录 一、LVS技术原理 二、NAT模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、软件安装与启用 3、测试 三、DR模式原理及部署方法 1、工作原理 2、部署方法 1、网络配置 2、解决vip响应问题 3、测试 四、ipvsadm命令及参数 1、管理集群服务&#x…...

Java网络编程——HTTP协议原理
协议 我们在网上冲浪时,会在浏览器地址栏输入一个网址,然后就能打开网页了。比如,输入 https://www.douban.com/就可以访问到豆瓣的主页: 那么大家是否好奇:https 是什么意思,作用又是什么呢?…...

java之多线程篇
一、基本概念 1.什么是线程? 线程就是,操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。简单理解就是:应用软件中互相独立,可以同时运行的功能 2.什么是多线程? 有了多线…...
【深度学习】TTS,CosyVoice,训练脚本解析
https://github.com/FunAudioLLM/CosyVoice/blob/main/examples/libritts/cosyvoice/run.sh Bash 脚本是一个语音合成(TTS)训练和推理的完整流水线。让我们逐步解析这个脚本的各个部分。 初始化部分 #!/bin/bash # Copyright 2024 Alibaba Inc. All Rights Reserved. . ./…...

《Unity3D网络游戏实战》学习与实践
纸上得来终觉浅,绝知此事要躬行~ Echo 网络上的两个程序通过一个双向的通信连接实现数据交换,这个连接的一端称为一个Socket “端口”是英文port的意译,是设备与外界通信交流的出口。每台计算机可以分配0到65535共65536个端口 每一条Sock…...

Machine_Matrix打靶渗透【附代码】(权限提升)
靶机下载地址: https%3A%2F%2Fdownload.vulnhub.com%2Fmatrix%2FMachine_Matrix.zip 1. 主机发现端口扫描目录扫描敏感信息获取 1.1. 主机发现 nmap -sn 192.168.7.0/24|grep -B 2 08:00:27:D9:36:81 1.2. 端口扫描 nmap -p- 192.168.7.155 1.3. 目录扫描 dir…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
反射获取方法和属性
Java反射获取方法 在Java中,反射(Reflection)是一种强大的机制,允许程序在运行时访问和操作类的内部属性和方法。通过反射,可以动态地创建对象、调用方法、改变属性值,这在很多Java框架中如Spring和Hiberna…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...

用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
uniapp 字符包含的相关方法
在uniapp中,如果你想检查一个字符串是否包含另一个子字符串,你可以使用JavaScript中的includes()方法或者indexOf()方法。这两种方法都可以达到目的,但它们在处理方式和返回值上有所不同。 使用includes()方法 includes()方法用于判断一个字…...