文件操作的详序

1.为什么使用文件?

如果没有文件,我们写的程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了,等再次运行程序,是看不到程序的数据的,如果将数据进行持久化的保存,我们可以使用文件。

2.程序文件和数据文件

程序文件包括源程序文件(后缀为.c),目标文件(window环境后缀为.obj),可执行程序(windows环境后缀为.exe);数据文件:文件的内容不一定是程序,而是程序运行时读写的数据,程序运行需要从中读取数据的文件,或这输出内容的文件。

3.二进制文件和文本文件

数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存的文件中,就是二进制文件。如果要求在外存上以ASCII码的形式存储,则需要在存储前转换,以ASCII字符的形式存储的文件就是文本文件。

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

4.文件的打开和关闭

4.1 流和标准流

4.1.1 流

我们程序的数据需要输出到各种外部设备,也需要从外部设备获取数据,不同的外部设备的输入输出操作各不相同,为了方便程序员对各种设备进行方便的操作,我们抽象出了流的概念,我们可以把流想象成流淌着字符的河。

 4.1.2 标准流

stdin - 标准输入流,在大多数的环境中从键盘输入,scanf函数就是从标准输入流中读取数据。

stdout - 标准输出流,在大多数的环境中输出至显示器界面,printf函数就是将信息输出到标准输出流中。

stderr - 标准错误流,大多数环境中输出到显示器界面。

这是默认打开了这三个流,我们使用scanf,printf等函数就可以直接进行输入输出操作的。

stdin,stdout,stderr三个流的类型是:FILE*,通常称为文件指针

4.2 文件指针

每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。

例如:

struct _iobuf 
{
	char* _ptr;
	int _cnt;
	char* _base;
	int _flag;
	int _file;
	int _charbuf;
	int _bufsiz;
	char* _tmpfname;
};
typedef struct _iobuf FILE;

不同的C编译器的FILE类型包含的内容不完全相同,但是大同小异。

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息。一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便。

定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够间接找到与它关联的文件。

4.3 文件的打开和关闭

文件在读写之前应该先打开文件,在使用结束之后应该关闭文件 。

在编写程序的时候,在打开文件的同时,都会返回一个FILE*的指针变量指向该文件,也相当于建立了指针和文件的关系。

ANSIC规定使用fopen函数来打开文件,fclose来关闭文件。

实例代码:

#include <stdio.h>
int main()
{
	FILE* pFile;
	//打开文件
	pFile = fopen("myfile.txt", "w");
	//文件操作
	if (pFile != NULL)
	{
		fputs("fopen example", pFile);
		//关闭文件
		fclose(pFile);
	}
	return 0;
}

 5.文件的顺序读写

5.1 顺序读写函数介绍

 上面说的适用于所有输入流一般是指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般是指适用于标准输出流和其他输出流。

6.文件随机读写

6.1 fseek

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

#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;
}

6.2 ftell

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

#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);
		size = ftell(pFile);
		fclose(pFile);
		printf("Size of myfile.txt:%ld bytes.\n", size);
	}
	return 0;
}

6.3 rewind

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

#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;
}

7.文件读取结束的判定

7.1 被错误使用的feof

在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。feof的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。

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

例如:

fgetc判断是否为EOF,

fgets判断返回值是否为NULL。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【六 (2)机器学习-机器学习建模步骤/kaggle房价回归实战】

一、确定问题和目标&#xff1a; 1、业务需求分析&#xff1a; 与业务团队或相关利益方进行深入沟通&#xff0c;了解他们的需求和期望。 分析业务流程&#xff0c;找出可能的瓶颈、机会或挑战。 思考机器学习如何帮助解决这些问题或实现业务目标。 2、问题定义&#xff1a;…

四种IP地址的区别

动态IP、固定IP、实体IP和虚拟IP是计算机网络中常见的IP地址类型&#xff0c;它们在分配方式、稳定性、应用场景等方面存在显著的差异。下面将详细阐述这四种IP地址的区别。 首先&#xff0c;动态IP地址是一种临时分配给设备或主机的可变IP地址。每次设备连接到网络时&#xf…

4.2作业

使用模板类&#xff0c;实现顺序栈 #include <iostream> #include <iomanip>using namespace std;template <typename T>class stack{public:T *data;T top;T MAXsizeof;//操作函数stack(int buf 100); //栈的建立bool push(const T a); //出栈bool pop(); …

rhce复习1

虚拟机初始化配置 bash 1、安装系统&#xff0c;选择对应的linux版本&#xff0c;阿里云镜像站点、163镜像站点等等 2、装好系统后&#xff0c;先配置网络&#xff1a;ip地址&#xff0c;掩码&#xff0c;网关&#xff0c;dns域名解析服务器 [rootlocalhost ~]# nmtui [rootlo…

3.写一个char类型的字符数组,对该数组访问越界时抛出异常,并做处理。

#include <iostream>using namespace std;char arr[10]"12345678"; void show(int i) {if(i>10){throw int(2);}cout << arr[i] <<endl; } int main() {int i;cin >> i;try {show(i);} catch (int) {cout << "越界" <…

SSM框架学习——工厂模式、Spring核心容器与Bean

工厂模式、核心容器与Spring Bean 工厂模式 工厂模式是Java中常用的一种设计模式&#xff0c;这种类型的设计模式属于创建型模式。说白了在代码层面就是取消了new的使用。 工厂模式有三种&#xff1a; 简单工厂模式工厂方法模式抽象工厂模式 举个例子&#xff0c;我们去买…

无缝投屏技巧:怎样将Windows电脑屏幕共享到安卓手机?

使用屏幕共享技术的好处是多方面的。首先&#xff0c;它为远程协助提供了极大的便利。当用户遇到电脑操作难题时&#xff0c;技术支持人员可以远程查看用户的屏幕&#xff0c;实时指导解决问题&#xff0c;就像他们身临其境一样。其次&#xff0c;这种技术也为教育和培训带来了…

时序预测 | Python实现VMD-CNN-LSTM时间序列预测

时序预测 | Python实现VMD-CNN-LSTM时间序列预测 目录 时序预测 | Python实现VMD-CNN-LSTM时间序列预测预测效果基本介绍模型描述代码设计预测效果 基本介绍 VMD-CNN-LSTM 是一种混合深度学习模型,结合了变分模态分解(VMD)、卷积神经网络(CNN)和长短期记忆网络(LSTM)的…

C#中值类型与引用类型的存储

目录 值对象与引用对象的存储 引用对象的成员存储 值对象与引用对象的存储 数据项的类型定义了存储数据需要的内存大小及组成该类型的数据成员。类型还决定了对象在内存中的存储位置——栈或堆。 C#中类型分为两种&#xff1a;值类型和引用类型&#xff0c;这两种类型的对象…

“省钱有道”的太平鸟,如何真正“高飞”?

衣食住行产业中&#xff0c;服装品类消费弹性较大、可选属性较强&#xff0c;其发展可以显著反映当前的经济温度。 根据国家统计局数据&#xff0c;2023年1-12月&#xff0c;我国限额以上单位服装类商品零售额累计10352.9亿元&#xff0c;同比增长15.4%&#xff0c;增速比2022…

LLMs之DBRX:DBRX的简介、安装和使用方法、案例应用之详细攻略

LLMs之DBRX&#xff1a;DBRX的简介、安装和使用方法、案例应用之详细攻略 导读&#xff1a;2024年3月27日(美国时间)&#xff0c;DBRX是Databricks推出的一款新型开源大语言模型&#xff0c;主要特征和优势总结如下&#xff1a; >> 表现优异&#xff1a;DBRX在各类自然语…

Pixelmator Pro:专业级图像编辑,触手可及mac/win版

Pixelmator Pro是一款功能强大的图像编辑软件&#xff0c;专为Mac操作系统设计。它拥有直观的界面和丰富的工具&#xff0c;能够满足用户各种图像处理需求。 Pixelmator Pro软件获取 首先&#xff0c;Pixelmator Pro支持多种文件格式&#xff0c;包括JPEG、PNG、GIF、BMP、TIF…

投稿指南【NO.12_9】【极易投中】核心期刊投稿(现代电子技术)

近期有不少同学咨询投稿期刊的问题&#xff0c;大部分院校的研究生都有发学术论文的要求&#xff0c;少部分要求高的甚至需要SCI或者多篇核心期刊论文才可以毕业&#xff0c;但是核心期刊要求论文质量高且审稿周期长&#xff0c;所以本博客梳理一些计算机特别是人工智能相关的期…

算法第三十八天-故障键盘

故障键盘 题目要求 解题思路 提示&#xff1a;把反转看成是往字符串的头部添加字符。 具体来说&#xff1a; 如果当前处于「往字符串尾部添加字符」的状态&#xff0c;那么遇到 i 后&#xff0c;改成「往字符串头部添加字符」的状态。 如果当前处于「往字符串头部添加字符」…

基于8086贪吃蛇游戏系统方恨设计

**单片机设计介绍&#xff0c;基于8086贪吃蛇游戏系统方恨设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于8086的贪吃蛇游戏系统设计是一个结合了微处理器控制、游戏逻辑以及图形显示技术的综合性项目。该系统旨在通过8086微处理器…

n2.堆栈

1.堆栈的介绍 表达式求值 因为不同的符号优先级不同&#xff0c;所以计算起来相对困难一些 后缀表达式 这里后缀表达式就用到了堆栈。它先从左向右进行扫描&#xff0c;碰到运算数就记住&#xff0c;碰到运算符就将离着这个运算符最近的两个运算数进行运算… 堆栈是一种储存方…

六、从零实战企业级K8S本地部署ThingsBoard专业版集群

1、从 docker hub 拉取 ThingsBoard PE 映像&#xff08;所有节点&#xff09; 1.1、查看k8s信息&#xff08;主节点&#xff09; kubectl cluster-info #查看k8s集群信息 kubectl get node #查看节点信息 kubectl get pod -A #查看内部组件1.2、从 d…

Docker:探索容器化技术,重塑云计算时代应用交付与管理

一&#xff0c;引言 在云计算时代&#xff0c;随着开发者逐步将应用迁移至云端以减轻硬件管理负担&#xff0c;软件配置与环境一致性问题日益凸显。Docker的横空出世&#xff0c;恰好为软件开发者带来了全新的解决方案&#xff0c;它革新了软件的打包、分发和管理方式&#xff…

【C++第二阶段】继承多态电脑组装实例

你好你好&#xff01; 以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 继承继承语法继承方式继承中的对象模型继承中构造和析构顺序同名成员处理同名静态成员处理多继承语法菱形继承问题 多态多态基本概念重写&重载 多态原理多…

中仕公考:不同省事业编考试内容一样吗?

在各省份的事业单位公开招聘过程中&#xff0c;考试内容是不一样的。虽然每一年都有很多省份参加事业编联考&#xff0c;且这些联考的考试日期相同&#xff0c;但是考试内容并不一样。各省将依据当地的特定情况来设计考试题目&#xff0c;其中会涉及到与本省的地理、经济、文化…