【C】文件操作详解

news2025/2/2 19:06:30

这里写目录标题

  • 文件操作
    • 什么是文件
    • 文件名
    • 文件类型
      • 文本文件
      • 二进制文件
    • 文件缓冲区
    • 文件指针
    • 文件的打开和关闭
      • fopen
      • fclose
  • 文件的顺序读写
    • fgetc
    • fputc
    • fgets
    • fputc
    • fscanf
    • fprintf
    • fwrite
    • fread
    • 比较scanf/fscanf/sscanf
      • sscanf
    • 比较printf/fprintf/sprintf
      • sprintf
  • 文件的随机读写
    • fseek
    • ftell
    • rewind
  • 文件结束的标志
    • 被错误使用的 feof

在这里插入图片描述

文件操作

什么是文件

磁盘上的文件是文件。
但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件

程序文件

包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。

数据文件

文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。

有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。

我们里讲的都是数据文件。

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。
文件名包含3部分:文件路径+文件名主干+文件后缀
例如: c:\code\test.txt
为了方便起见,文件标识常被称为文件名。

文件类型

文本文件

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

二进制文件

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。
如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节。

文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

也就是说我们从磁盘和内存中间有一个文件缓冲区,从文件中拿数据时,会先放到文件缓冲区中去,当放满以后才会输入到内存,我们也可以通过特殊的手段,提前清空缓冲区。
在这里插入图片描述

文件指针

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。
每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是有系统声明的,取名FILE.
不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。
每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。
一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

FILE* pc // 文件指针变量
通过文件指针变量能够找到与它关联的文件。

文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件。
在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。
ANSIC 规定使用fopen函数来打开文件,fclose来关闭文件。

fopen

FILE * fopen ( const char * filename, const char * mode );

打开方式如下:
在这里插入图片描述

fclose

int fclose ( FILE * stream );

打开和关闭两个函数要配合使用。
举个具体的例子,代码如下;

#include <stdio.h>

int main()
{
	//打开文件
	FILE* pc = fopen("text.txt", "w");
	if (pc == NULL)
	{
		//打开失败,直接返回
		perror("fopen");
		return 1;
	}
	//读写文件

	//关闭文件
	fclose(pc);
	pc = NULL;
	return 0;
}

文件的顺序读写

下图都是一些顺序读写的函数:
在这里插入图片描述

fgetc

int fgetc( FILE *stream );

从文件中读一个字符。

fputc

int fputc( int c, FILE *stream );

输出一个字符到文件中。

fgets

char *fgets( char *string, int n, FILE *stream );

从文件中读一行,最多读n-1个字符。

fputc

int fputs( const char *string, FILE *stream );

输出一个字符串到文件中去。

fscanf

int fscanf( FILE *stream, const char *format [, argument ]… );

和scanf用法一样,前面多了个指针,可以是文件指针,从文件中读,也可以是标准输入流stdin,从键盘中读入数据。

fprintf

int fprintf( FILE *stream, const char *format [, argument ]…);

和printf用法一样,前面多了个指针,可以是文件指针,输出到文件,也可以用标准输出流stdout输出到屏幕

fwrite

size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );

二进制的写,写count个size大小的buffer指向的内容到stream中去。

fread

size_t fread( void *buffer, size_t size, size_t count, FILE *stream );

二进制的读,从文件中读count个size大小的数据到buffer指向的空间中去。

比较scanf/fscanf/sscanf

sscanf

int sscanf( const char *buffer, const char *format [, argument ] … );

scanf 是从标准输入流中读取格式化的数据
fscanf 是从所有输入流中读取格式化的数据
sscnaf 是从字符串种读取格式化的数据

比较printf/fprintf/sprintf

sprintf

int sprintf( char *buffer, const char *format [, argument] … );

printf 是将格式化的数据输出到标准输出流中去。
fprintf 是将格式化的数据输出到所有输出流中去。
sprintf 是将格式化的数据转化为一个字符串。

文件的随机读写

fseek

根据文件指针的位置和偏移量来定位文件指针。

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

origin的三个取值:
在这里插入图片描述
SEEK_CUR是指指针当前的位置。
SEEK_END是文件末尾位置。
SEEK_SET是文件开始位置。

ftell

返回文件指针相对于起始位置的偏移量。

long int ftell ( FILE * stream );

rewind

让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

文件结束的标志

被错误使用的 feof

在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束。
而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束。

文本文件读取是否结束,判断返回值是否为EOF (fgetc),或者NULL(fgets)
例如:
fgetc判断是否为EOF.
fgets判断返回值是否为NULL.

二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。
例如:
fread判断返回值是否小于实际要读的个数。

今天的分享就到这里,感谢大家的关注和支持。

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

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

相关文章

周考一之重做

输入一个学生的成绩&#xff0c;如果学习成绩>90分的同学用A表示&#xff0c;60-89分之间用B表示&#xff0c;60分以下的用C表示(10) public static void main(String[] args){ Scanner scanner new Scanner(System.in); System.out.println(“请输入学生成绩&#xff1a;…

linux图形界面总结---X、Xorg、WM、QT、GTK、KDE、GNOME的区别与联系

文章目录 一、 linux图形界面二、X协议三、Xfree86 Xorg四、WM(window manager:窗口管理器)五、X协议的Client端实现六、KDE、GNOME、QT和GTK直接关系七、参考&#xff1a; 一、 linux图形界面 linux本身没有图形界面&#xff0c;linux现在的图形界面的实现只是linux下的应用程…

值类型与引用类型

常见的值类型&#xff1a;int&#xff0c;long&#xff0c; short&#xff0c; float&#xff0c; double&#xff0c; byte&#xff0c; char&#xff0c; enum&#xff0c; struct...... 常见的引用类型&#xff1a;字符串&#xff0c; 数组&#xff0c; 类...... 区别&…

附录10-3.JS正则常见案例

目录 1 某一个字符串重复出现两次 2 多行字符串转变为数组套对象 3 多个正则表达式匹配一个字符 4 在指定的字符前加一些什么东西 1 某一个字符串重复出现两次 match的方式如果你使用小括号分组&#xff0c;第一个结果是符合正则的结果&#xff0c;也就是我查出来了 l…

Excel表格怎么样转换成PDF?分享这3个方法免费转换!

在日常办公和学习中&#xff0c;我们常常需要将Excel表格转换为PDF格式以便分享、打印或存档。本文将介绍三种简便的免费方法。方法一介绍了记灵在线工具&#xff0c;方法二使用办公软件&#xff08;WPS或Office&#xff09;&#xff0c;方法三则使用Adobe软件。 方法一&#…

大二毕设.2-自研Spring框架

目录 项目描述&#xff1a; 基本演示 提取标记类 IOC容器的装载 IOC容器的操作 DI依赖注入 Aspect排序 AOP MVC 功能实现讲解 项目描述&#xff1a; 为了更好地学习 Spring 的核心&#xff0c;参考 Spring 源码实现的一个简易框架当前已实现 IOC&#xff0c;DI依赖注…

交叉编译gRPC初实践

快速开始 一、创建android编译目录&#xff0c;在grpc源码根目录下运行&#xff1a; mkdir -p cmake/build_android && cd cmake/build_android 二、cmkae生成对应Makefile等编译所需的文件 cmake -DCMAKE_TOOLCHAIN_FILE/zhuyazhou/DDS/tools_dds/android-ndk-r25/b…

Python(Conda)环境迁移(从win10到macos12.5)笔记

文章目录 背景环境 1、通过conda迁移2、通过python迁移3、最后&#xff08;逐一安装&#xff09; 背景环境 win10是以前安装的conda和py。目前需要导出的环境的版本为py3.10.4。macos是重新安装的conda&#xff0c;目前有的环境是py3.11.4。我是先进conda用刚安装好的base创建…

idea 有时提示找不到类或者符号,日志报java: 找不到符号的解决

解决一&#xff1a; idea maven编译成功&#xff0c;运行失败提示找不到符号&#xff0c;主要是get和set方法找不到符号&#xff0c;此时就是idea的lombok版本冲突 IDEA版本导致的Lombok失效&#xff0c;需要更新lombok版本到1.18.14及之后版本得到解决 <dependency>&…

计划、逻辑与智能

有计划性是指基于目标、目的或问题&#xff0c;通过制定计划、设立步骤和执行策略来达成预期结果的思维和行为。有计划的智能强调理性、逻辑和目标导向&#xff0c;它能够帮助人们更好地组织和管理资源&#xff0c;解决复杂的问题&#xff0c;并实现预期的目标。 无计划性则代表…

Seal AppManager如何基于Terraform简化基础设施管理

作者简介 陈灿&#xff0c;数澈软件Seal 后端研发工程师&#xff0c;曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践。在敏捷研发和产品效能提升有着丰富的经验&#xff0c;致力于构建一站式研发友好的平台工程解决方案。现在是 Seal 平台工程团队核心研发人员。…

配置spark

配置spark Yarn 模式Standalone 模式Local 模式 Yarn 模式 tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module cd /opt/module mv spark-3.0.0-bin-hadoop3.2 spark-yarn修改 hadoop 配置文件/opt/module/hadoop/etc/hadoop/yarn-site.xml, 并分发 <!--是否启动一…

【板栗糖GIS】——如何安装ffmpeg

【板栗糖GIS】——如何安装ffmpeg 目录 1. 解压安装包 2. 把bin路径放在环境变量中 3. 检测是否安装成功 下载软件包&#xff0c;我已经准备好资源&#xff0c;只是审核还未通过&#xff0c;过两天会加上安装包链接 1. 解压安装包 2. 把bin路径放在环境变量中 3. 检测是否…

Anaconda安装和激活

一、Anaconda下载地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序安装完Anaconda后&#xff0c…

面试经验分享 | 如何打造优秀的个人简历

月説小飞象交流会 一个人自身拥有越丰富&#xff0c;他对身外之物的需求也就越少&#xff0c;别人对他来说就越不重要。 内部交流│27期 面试经验分享| 打造优秀的个人简历 data analysis ●●●● 分享人&#xff1a;夏宇 暑假将至&#xff0c;毕业季来临&#xff0c;有准备实…

timing报告中的半周期现象

遇到phase shift是半个周期的问题多数是endpoint寄存器是下降沿触发的原因,举例来说,一个正向时钟周期的开始是0-1的跳变,下一个周期的开始也是如此,所以计算上升沿触发的寄存器的周期就是完整的周期值,而下降沿触发的寄存器就要在半周期也就是1-0的时候触发跳变,phase s…

评分高达92.6%!谷歌AI医疗大模型重磅论文登上《自然》:水平媲美临床医生

“AI医生”&#xff0c;离我们越来越近了。 7月12日&#xff0c;谷歌和DeepMind的科研人员在《自然》杂志上发表了一项研究&#xff0c;不仅提出了MultiMedQA&#xff08;美国医师执照试题&#xff09;评估基准&#xff0c;用于评估大语言模型在编码临床知识方面的表现&#x…

【技能实训】DMS数据挖掘项目-Day12

文章目录 任务14【任务14.1】类ClientFrame【任务14.1.1】在构造函数中定义组件属性【任务14.1.2】补充initConfig()方法的代码&#xff0c;获取客户端配置信息【任务14.1.4】菜单界面的初始化方法【任务14.2】在14.1的基础上&#xff0c;实现日志数据与物流数据的采集功能 任务…

安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制文件管理模块包含上传遍历写入删除下载安全

文章目录 文件管理模块-上传-过滤机制文件管理模块-显示-过滤机制PHP文件操作安全文件包含文件上传文件删除文件下载文件编辑 文件管理模块-上传-过滤机制 $_FILES&#xff1a;PHP中一个预定义的超全局变量&#xff0c;用于在上传文件时从客户端接收文件&#xff0c;并将其保存…

基于 OpenVINO 的目标识别

基于 OpenVINO 的目标识别 YOLOV5原理 YOLOv5是一种快速高效的目标检测算法&#xff0c;具有优秀的实时性能和较高的准确度。该算法利用深度学习技术实现了端到端的目标检测&#xff0c;在计算资源有限的情况下也能够获得出色的表现 YOLOv5采用了一种基于Anchor的检测方式&…