第十一章 文件操作

news2024/11/17 14:25:09

文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。文件标识包括3部分:
(1)文件路径;(2)文件名主干;(3)文件后缀。
在这里插入图片描述

文件分类

根据数据的组织形式,数据文件可分为ASCI文件和二进制文件。
数据在内存中是以二进制形式存储的,如果不加转换地输出到外存,就是二进制文件,可以认为它就是存储在内存的数据的映像,所以也称之为映像文件(image file)。
如果要求在外存上以ASCII代码形式存储,则需要在存储前进行转换。ASCI文件又称文本文件(text file),每一个字节放一个字符的ASCII代码。

文件缓冲区

ANSI C标准采用**“缓冲文件系统”**处理数据文件,所谓缓冲文件系统是指系统自动地在内存区为程序中每一个正在使用的文件开辟一个文件缓冲区。从内存向磁盘输出数据必须先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘去。如果从磁盘向计算机读入数据,则一次从磁盘文件将一批数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(给程序变量),见图10.2。缓冲区的大小由各个具体的C编译系统确定。
在这里插入图片描述
刷新缓冲区:
1、缓冲区满了 2、调用函数fflush 3、程序结束

文件指针

概念

缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。每个被使用的文件都在内存中开辟一个相应的文件信息区,用来存放文件的有关信息(如文件的名字、文件状态及文件当前位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名为FILE。
FILE在stdio.h文件中的类型声明:

typedef struct{
  short level;//缓冲区“满”或“空”的程度
  unsigned flags;//文件状态标志
  char fd;//文件描述符
  unsigned char hold;//如缓冲区无内容不读取字符
  short bsize;//缓冲区的大小
  unsigned charw bufler;//数据缓冲区的位置
  unsigned char # curp;//指针当前的指向
  unsigned istemp;//临时文件指示器
  short token;//用于有效性检查
}FILE;

对文件进行读写等操作的时候,对文件指针进行操作即可。
c语言中由三个特殊的文件指针无需定义,在程序中可以直接使用:
stdin:标准输入,默认为当前终端(键盘)。
stdout: 标准输出,默认为当前终端(屏幕)。
stderr: 标准错误输出设备文件 默认当前终端(屏幕)

定义方式

FILE * 指针变量标识符;

打开文件fopen

函数:FILE *fopn(const char path, const char mode);
打开一个已经存在的文件,并返回文件的文件指针。或者创建一个文件,并打开文件,返回文件标识。
读取成功为文件地址,失败为0
参数:
1、文件的路径

  • 绝对路径
  • 项目路径
    2、 文件打开方式
    在这里插入图片描述
    在这里插入图片描述

关闭文件 fclose

函数:int fclose(FILE *fp);
关闭fp所代表的文件。一个文件只能关闭一次。
返回值:
成功返回0,失败返回非0

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	FILE* file1 = fopen("./test.txt", "r+");
	if (file1 == NULL) {
		printf("文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	fclose(file1);
	return 0;
}

读写字符函数

在这里插入图片描述
EOF:是stdio.h文件中定义的符号常量,值未-1

fgetc

int fgetc(FILE *stream);
返回值:
以文本的方式: 读到文件结尾返回EOF(即-1)
以二进制的方式:读到文件结尾,使用函数feof(文件指针)判断结尾
feof是c语言标准库函数,在stdio.h中,功能是检测刘尚的文件结束符,如果结束返回非0,未结束返回0

fputc

int fpuct(int c, FILE *stream);
将c的值写入sream所代表的文件中。
返回值:
成功返回输出的字节值。
失败返回EOF

int main()
{
	FILE* file1 = fopen("./test.txt", "a+");//读写追加方式打开
	if (file1 == NULL) {
		printf("文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	char temp;
	while ((temp = fgetc(file1)) != EOF) {
		printf("%c", temp);
	}
	fputc('A', file1);//读取完事再写入一个字符A
	fclose(file1);
	return 0;
}

读写字符串

fgets

char *fgets(char *s, int size, FILE *fp);
从我呢见中读取字符,读取的时候碰到换行符或者文件末尾停止读取,或者读取了size-1个字节的时候停止。

返回值:
成功返回s的地址,失败返回NULL。

fputs

int fputs(const char *str, FILE *fp);
将s指向的字符串,写入到文件中。
返回值:
成功返回写入的字节数,失败返回-1

文件复制:
文件test:
在这里插入图片描述

#include<stdio.h>
#pragma warning(disable:4996)
int main()
{
	FILE* file1 = fopen("./test.txt", "a+");//
	if (file1 == NULL) {
		printf("file1文件打开失败\n");
		return 0;
	}
	FILE* file2 = fopen("./test1.txt", "w+");//打开文件test1,没有会新建
	if (file2 == NULL) {
		printf("file2文件打开失败\n");
		return 0;
	}
	printf("打开成功\n");
	char res[100];
	//读取字符串,写入文件2
	while (fgets(res, 100, file1) != NULL) {
		fputs(res, file2);
	}
	fclose(file1);
	fclose(file2);
}

二进制方式读写

fread

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *fp);
从文件读取数据,一块是size个字节,共nmemb块,存放到ptr指向的内存中。
返回值:实际读到的块数。不到一块,小于size个字节,返回0

fwrite

size_t fwrite(void *ptr, size_t size, size_t nmemb, FILE *fp);
将ptr指向的内存中的数据,向文件中写入,一块size个字节,共nmemb块。
返回值:实际写入的块数

保存数据,读取数据。

#include<stdio.h>
#pragma warning(disable:4996)
typedef struct stu {
	int age;
	char name[100];
}STU;
int main()
{
	FILE* wFile = fopen("./test.txt", "wb+");
	if (wFile == NULL) {
		printf("wFile文件打开失败\n");
		return 0;
	}
	STU class[2] = {{11, "Tom"}, {12, "lisi"}};
	fwrite(class, sizeof(STU), 2, wFile);//将class数组的数据写入文件
	rewind(wFile);//文件指针写操作后,到了最后,需要复位
	STU resClass[2];
	//循环读取文件数据到resClass数组中。
	for (int i = 0; i < 2; ++i) {
	 	fread(&resClass[i], sizeof(resClass[i]), 1, wFile);
	}
	printf("%d, %s\n", resClass[0].age, resClass[0].name);//11,Tom
	printf("%d, %s\n", resClass[1].age, resClass[1].name);//12,lisi
	fclose(wFile);
}

随机读写数据

前面介绍的都是顺序读写,从开头到结尾。
我们可以将指针移动到需要读写的位置,再进行读写。这种称为随机读写。

rewind

void rewind(FILE *fp);
把文件内部的位置指针移动到文件开始。

fseek

fseek(FILE *stream, long offset, int origin);
用来改变文件位置标记
参数:

  • 文件
  • 偏移量
  • 起始点

在这里插入图片描述

fseek (dp,100L,0);//将文件位置标记向前移到离文件开头100个字节处
fseek (fp,50L,1);//将文件位置标记向前移到离当前位置50个字节处
fseek (fp.-10L,2);//将文件位置标记从文件末尾处向后退10个字节

ftell

long ftell(FILE *fp);
测文件读写位置距为你教案开始由多少个字节。
返回值:
返回读写位置,出错范围-1;

#include<stdio.h>
#pragma warning(disable:4996)
typedef struct stu {
	int age;
	char name[100];
}STU;
int main()
{
	FILE* wFile = fopen("./test.dat", "wb+");
	if (wFile == NULL) {
		printf("wFile文件打开失败\n");
		return 0;
	}
	STU class[2] = {{11, "Tom"}, {12, "lisi"}};
	fwrite(class, sizeof(STU), 2, wFile);
	printf("距离%d\n", ftell(wFile));//208
	rewind(wFile);
	printf("距离%d\n", ftell(wFile));//0
	fclose(wFile);
}

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

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

相关文章

【opencv】windows10下opencv4.8.0-cuda C++版本源码编译教程

【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【opencv】windows10下opencv4.8.0-cuda C版本源码编译教程前言准备工具cuda/cudnncmakeopencv4.8.0opencv_contrib CMake编译VS2019编…

速通RabbitMQ的五种常见消费模型

目录 引言1. 简单队列模型&#xff08;Simple Queue Model&#xff09;优缺点及适用场景代码示例 2. 工作队列模型&#xff08;Work Queue Model&#xff09;优缺点及适用场景代码示例 3. 发布/订阅模型&#xff08;Publish/Subscribe Model&#xff09;优缺点及适用场景代码示…

Rockchip平台 远程OTA服务搭建

Rockchip平台 远程OTA服务搭建 1. 概述 远程OTA升级服务是一种通过互联网远程更新Rockchip设备的固件和软件的方法。这种服务对于确保设备安全性、修复错误和添加新功能非常重要。 本文档将引导您完成在Rockchip平台上搭建远程OTA升级服务的过程。 在阅读本文的前&#xff…

使用Cpolar内网穿透技术实现远程访问内网BUG管理系统

文章目录 前言1. 本地安装配置BUG管理系统2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射本地服务3. 测试公网远程访问4. 配置固定二级子域名4.1 保留一个二级子域名5.1 配置二级子域名6. 使用固定二级子域名远程 前言 BUG管理软件,作为软件测试工程师的必备工具之一。在…

利用人工智能做射击游戏辅助(二)AlphaPose环境配置

一、anaconda安装 官网地址&#xff1a;Free Download | AnacondaAnacondas open-source Distribution is the easiest way to perform Python/R data science and machine learning on a single machine.https://www.anaconda.com/download 下载之后下一步就可以&#xff0c…

BCDD-A03-21-L3、BCDD-A02-33-L1比例方向阀控制器

BCDD-A02-31-L1、BCDD-A02-33-L3、BCDD-A02-21-S5、BCDD-A02-23-D5、BCDD-A03-31-L5、BCDD-A03-33-L1、BCDD-A03-21-L3、BCDD-A03-23-S5是直动式比例换向阀&#xff0c;通过比例电磁铁直接驱动阀芯工作。此类阀工作时是通过电子放大器提供比例电磁铁的驱动电流&#xff0c;比例…

哈夫曼树及哈夫曼编码详解及代码实现[C/C++]

文章目录 哈夫曼树及哈夫曼编码哈夫曼树的定义与原理引例路径长度定义 带权路径长度哈夫曼树哈夫曼树的构造方法构造方法示例 哈夫曼树的代码实现哈夫曼树的结点定义哈夫曼树的构造 哈夫曼编码哈夫曼编码方式哈夫曼编码解码的准确性 哈夫曼编码的代码实现运行示例 哈夫曼树及哈…

Android绑定式服务

Github:https://github.com/MADMAX110/Odometer 启动式服务对于后台操作很合适&#xff0c;不过需要一个更有交互性的服务。 接下来构建这样一个应用&#xff1a; 1、创建一个绑定式服务的基本版本&#xff0c;名为OdometerService 我们要为它增加一个方法getDistance()&#x…

PDF编辑软件哪个好用?PDF文档怎么编辑修改内容

在生活中&#xff0c;为了方便文件传输&#xff0c;会将文件扫描或转换成PDF格式&#xff0c;但是如果需要编辑修改会比较麻烦&#xff0c;这时一款好用的PDF编辑器显得十分重要。今天就带大家了解下PDF编辑软件哪个好用&#xff0c;PDF文档怎么编辑修改内容。 一、PDF编辑软件…

【Android 从入门到出门】第一章:Android开发技能入门指南

&#x1f935;‍♂️ 个人主页&#xff1a;艾迦洼的个人主页 ✍&#x1f3fb;作者简介&#xff1a;后端程序猿 &#x1f604; 希望大家多多支持&#xff0c;如果文章对你有帮助的话&#xff0c;欢迎 &#x1f4ac;&#x1f44d;&#x1f3fb;&#x1f4c2; 目录 &#x1f44b;第…

C#(Csharp)我的基础教程(三)(我的菜鸟教程笔记)-控件对象与窗体容器集合(Control)的探究与学习

目录 1、窗体类&#xff08;主代码文件窗体设计器后台代码文件&#xff09;2、控件对象与窗体容器集合&#xff08;Control&#xff09; 1、窗体类&#xff08;主代码文件窗体设计器后台代码文件&#xff09; 主窗体对象的创建&#xff1a;在Program类里面&#xff1a; Appli…

Windows操作系统登录双因素认证解决方案 安当加密

实现Windows操作系统登录双因素认证&#xff0c;可以通过安当ASP身份认证平台进行设置。安当ASP身份认证平台提供了多种双因素认证方式&#xff0c;包括USB Key ID、OTP&#xff08;动态口令&#xff09;等&#xff0c;可以灵活选择和配置。 以下是使用安当ASP身份认证平台的US…

2023 家电行业品牌社媒营销洞察报告

过去三年的疫情&#xff0c;给人们的生活和消费方式都带来了极大的改变。直播电商、社交电商的兴起&#xff0c;也带动了传统线下家电零售商向线上渠道发展&#xff0c;传统大家电“重获新生”&#xff0c;新兴小家电“冉冉升起”&#xff0c;成为了业绩增长的新引擎。 2023年&…

c++视觉处理---拉普拉斯金字塔和高斯金字塔

拉普拉斯金字塔和高斯金字塔 拉普拉斯金字塔&#xff08;Laplacian Pyramid&#xff09;和高斯金字塔&#xff08;Gaussian Pyramid&#xff09;是两种不同类型的图像金字塔&#xff0c;用于多尺度图像处理和特征提取。它们之间的主要区别在于它们所包含的信息和用途&#xff…

ROS仿真软件Turtlebot-Gazebo的安装使用以及错误处理[机器人避障]

很多时候由于机器人价格比较贵&#xff0c;而且会因为环境因素、操作失误或者摔坏等&#xff0c;所以我们可以先在仿真软件上做测试&#xff0c;也可以避免这些问题&#xff0c;虽然没有那么真实感&#xff0c;可毕竟是免费的嘛。我们可以在这些仿真的机器人身上去学习如何控制…

格式化硬盘时提示“此驱动器正在使用”解决占用问题

Windows 11 或 Windows 10 的大多数问题都有一个很好的解决方案——格式化系统驱动器并重新安装 Windows。或者有时&#xff0c;我们可能只想擦除数据驱动器上的所有文件和文件夹&#xff0c;例如。D 盘、E 盘等。为此&#xff0c;我们只需右键单击 Windows 文件资源管理器的 P…

深度学习batch、batch_size、epoch、iteration以及小样本中episode、support set、query set关系

batch、batch_size、epoch、iteration关系&#xff1a; epoch&#xff1a;整个数据集 batch&#xff1a; 整个数据集分成多少小块进行训练 batch_size&#xff1a; 一次训练&#xff08;1 batch&#xff09;需要 batch_size个样本 iteration&#xff1a; 整个数据集需要用b…

深度学习简述

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

MT8390(Genio 700)安卓核心板参数_联发科MTK智能模组

MT8390安卓核心板是一款功能强大且高度集成的平台&#xff0c;专为广泛的人工智能(AI)和物联网(IoT)应用案例而设计。它具备高性能边缘处理、先进的多媒体和连接能力、多个高分辨率摄像头、连接的触摸屏显示以及多任务高级操作系统的使用。 MT8390安卓核心板采用了高性能的八核…

保护互联网数据安全:关键方法与最佳实践

在当今数字化时代&#xff0c;互联网数据安全已经成为个人、企业和组织的首要任务之一。随着信息技术的迅猛发展&#xff0c;网络威胁也不断演进&#xff0c;因此保护互联网数据安全变得尤为关键。本文将介绍一些关键方法和最佳实践&#xff0c;帮助您确保互联网数据的安全性。…