[C语言]-基础知识点梳理-文件管理

news2024/11/26 14:55:55

前言

  • 各位师傅们好,我是qmx_07,今天给大家讲解文件管理的相关知识,也就是常见的 读取,删除一类的操作

文件

为什么要使用文件?

  • 程序的数据是存储在电脑的内存中,如果程序退出,内存回收,数据就丢失了
  • 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化

文件分类

  • 在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的
  • 程序文件:包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)
  • 数据⽂件:⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件
  • 文件名:⽂件路径+⽂件名主⼲+⽂件后缀

文件的打开和关闭

文件指针

1.每个被使⽤的⽂件都在内存中开辟了⼀个相应的⽂件信息区,⽤来存放⽂件的相关信息(如⽂件的名字,⽂件状态及⽂件当前的位置等)。这些信息是保存在⼀个结构体变量中的。该结构体类型是由系统声明的,取名FILE
2.每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息, 使用者不必关心细节。
3.一般都是通过一个FILE的指针来维护这个FILE结构的变量,这样使用起来更加方便

FILE* pf;//⽂件指针变量
  • 定义pf是一个指向FILE类型数据的指针变量。可以使pf指向某个文件的文件信息区(是一个结构体变量)。通过该文件信息区中的信息就能够访问该文件。也就是说,通过文件指针变量能够找到与它关联的文件
    在这里插入图片描述

文件的打开和关闭

  • ⽂件在读写之前应该先打开⽂件,在使⽤结束之后应该关闭⽂件
  • ANSIC规定使⽤ fopen 函数来打开⽂件, fclose 来关闭⽂件
//打开⽂件 
FILE * fopen ( const char * filename, const char * mode );
//关闭⽂件 
int fclose ( FILE * stream );

mode表⽰⽂件的打开模式,下⾯都是⽂件的打开模式:
在这里插入图片描述

代码实例

#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("C:\\Users\\ASUS\\Desktop\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件

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

文件的顺序读写

在这里插入图片描述

写字符

写字符函数:

int fputc ( const char * str, FILE * stream );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	fputc('a', pf);

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

查看目录内容:
在这里插入图片描述

读取字符

读取字符函数原型:

int fgetc ( const char * str, FILE * stream );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	int ch = fgetc( pf);
	printf("%c", ch);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • 返回类型为 int 以适应特殊值 EOF,这表示失败.基于此,我们可以循环输出:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}
	printf("%c", ch);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

写一行数据

函数原型:

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

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写文件
	fputs("hello", pf);

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

在这里插入图片描述

  • “w"模式会覆盖文件内容,可以尝试使用"a”
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("test.txt", "a");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//写一行数据
	fputs("hello", pf);

	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

读取一行数据

函数原型:

char * fgets ( char * str, int num, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	//读取文件
	char arr[20];
	fgets(arr, 5,pf);
	printf("%s\n", arr);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • 读5个数据,真正读到的才4个,还有一个’\0’

格式化输出

函数原型:

int fprintf ( FILE * stream, const char * format, ... );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { "zhangsan",25,50.5f };

	FILE* pf = fopen("G:\\c_test\\test.txt", "w");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	fprintf(pf, "%s %d %f", s.arr, s.age, s.score);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

格式化输入

函数原型:

int fscanf ( FILE * stream, const char * format, ... );

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
struct S
{
	char arr[10];
	int age;
	float score;
};

int main()
{
	struct S s = { 0 };

	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}

	fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));
	printf("%s %d %f", s.arr, s.age, s.score);
	//关文件
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

二进制输出

函数原型:

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

代码实例:

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { "zhangsan",25,50.5f };
	//以二进制形式写到文件中
	FILE* pf = fopen("test.txt", "w");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制的方式写
	fwrite(&s, sizeof(struct S), 1, pf);


	fclose(pf);
	pf = NULL;
}

在这里插入图片描述

二进制输入

函数原型:

size_t fread ( void * ptr, size_t size, size_t count, FILE * stream );
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>

struct S
{
	char arr[10];
	int age;
	float score;
};
int main()
{
	struct S s = { 0};
	//以二进制形式写到文件中
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		perror("fopen");
		return 1;
	}
	//二进制的方式读取
	fread(&s, sizeof(struct S), 1, pf);
	printf("%s %d %f", s.arr, s.age, s.score);



	fclose(pf);
	pf = NULL;
}

在这里插入图片描述

文件随机读写

  • 随机读写:不从首个位置开始,而可以选择任意位置

fseek

函数原型:

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

文本内容:
在这里插入图片描述
代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	
	fseek(pf, 2, SEEK_CUR);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

  • SEEK_CUR就是在当前位置,在进行跳转

ftell

函数原型:

long int ftell ( FILE * stream );
  • 概念:返回文件指针相对于起始位置的偏移量
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	printf("%d\n", ftell(pf));//3

	//fseek(pf, 2, SEEK_CUR);
	fseek(pf, -1, SEEK_END);
	ch = fgetc(pf);
	printf("%c\n", ch);
	printf("%d\n", ftell(pf));//6
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

rewind

函数原型:

void rewind ( FILE * stream );

  • 概念:返回到文件起始位置

代码实例:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <errno.h>
int main()
{
	FILE* pf = fopen("G:\\c_test\\test.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;
	}
	//读文件
	//定位文件指针
	fseek(pf, 2, SEEK_SET);
	int ch = fgetc(pf);
	printf("%c\n", ch);
	rewind(pf);
	ch = fgetc(pf);
	printf("%c\n", ch);
	fclose(pf);
	pf = NULL;
	return 0;
}

在这里插入图片描述

文本文件和二进制文件

  • 根据数据的组织形式,数据⽂件被称为⽂本⽂件或者⼆进制⽂件。
  • 数据在内存中以⼆进制的形式存储,如果不加转换的输出到外存的⽂件中,就是⼆进制⽂件。
  • 如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的⽂件就是⽂本⽂件。
  • ⼀个数据在⽂件中是怎么存储的呢?
  • 字符⼀律以ASCII形式存储,数值型数据既可以⽤ASCII形式存储,也可以使⽤⼆进制形式存储在这里插入图片描述

文件读取和结束的判定

  • 牢记:在文件读取过程中,不能用feof函数的返回值直接用来判断文件的是否结束

  • 而是应用于当文件读取结束的时候,判断是读取失败结束,还是遇到文件尾结束

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

  • 二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。例如:
    fread判断返回值是否小于实际要读的个数。
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int c; // 注意:int,非char,要求处理EOF
    FILE* fp = fopen("test.txt", "r");
    if(!fp) {
        perror("File opening failed");
        return EXIT_FAILURE;
    }
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOF
    while ((c = fgetc(fp)) != EOF) // 标准C I/O读取文件循环
    {
        putchar(c);
    }
    //判断是什么原因结束的
    if (ferror(fp))
        puts("I/O error when reading");
    else if (feof(fp))
        puts("End of file reached successfully");
    fclose(fp);
}

文件缓冲区

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

  • 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文 件。如果不做,可能导致读写文件的问题。

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

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

相关文章

基于django的学生作业提交与管理系统,有管理后台,可作为课设使用

在本项目中&#xff0c;我们设计并实现了一个基于Django框架的学生作业提交与管理系统&#xff0c;旨在为教师和学生提供一个高效、便捷的作业管理平台。Django作为一个高效的Web框架&#xff0c;因其强大的功能和灵活的架构&#xff0c;使得本系统能够快速开发并扩展。 系统功…

KeyShot 2024.2:卓越的Mac与Windows 3D渲染与动画制作软件

KeyShot 2024.2作为一款专为Mac和Windows用户设计的3D渲染与动画制作软件&#xff0c;凭借其出色的性能和丰富的功能&#xff0c;在业界树立了新的标杆。这款软件不仅继承了KeyShot系列一贯的实时渲染和动画优势&#xff0c;还在多个方面进行了全面升级和优化&#xff0c;为3D设…

C++:二叉搜索树(binary search tree)

目录 1&#xff1a; 二叉搜索树概念 2&#xff1a;二叉搜索树操作 3&#xff1a;二叉树的模拟实现 4&#xff1a;二叉搜索树的应用 5&#xff1a;二叉搜索树的性能分析 6&#xff1a;复习前中后序遍历 7&#xff1a;二叉树进阶面试题 1&#xff1a; 二叉搜索树概念 二叉搜…

基于协同过滤算法的体育商品推荐系统_t81xg

TOC springboot618基于协同过滤算法的体育商品推荐系统_t81xg--论文 绪 论 近年来&#xff0c;随着互联网科技的进步和发展&#xff0c;人们的生活水平得到了极大的提高&#xff0c;图书的数量也在快速增加&#xff0c;以至于体育商品推荐的数量不断扩大&#xff0c;管理个性…

嵌入式学习——(Linux高级编程——线程)

线程 一、pthread 线程概述 pthread&#xff08;POSIX threads&#xff09;是一种用于在程序中实现多线程的编程接口。它与进程一样&#xff0c;可以用于实现并发执行任务&#xff0c;但与进程相比有一些不同的特点。 二、优点 1. 比多进程节省资源&#xff1a;进程在创建时…

如何用Java SpringBoot+Vue搭建太原学院商铺管理系统【实战教程】

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

【中项第三版】系统集成项目管理工程师 | 第 12 章 执行过程组

前言 本章属于10大管理的内容&#xff0c;上午题预计会考8-10分&#xff0c;下午案例分析也会进行考查。学习要以教材为主。 目录 12.1 指导与管理项目工作 12.1.1 主要输入 12.1.2 主要输出 12.2 管理项目知识 12.2.1 主要输入 12.2.2 主要输出 12.3 管理质量 12.3.…

新160个crackme - 037-fireworx.2

运行分析 图标是火炬&#xff0c;估计是Delphi程序&#xff0c;需要破解Name和Serial PE分析 Delphi程序&#xff0c;32位&#xff0c;无壳 静态分析&动态调试 - ida找到关键字符串&#xff0c;双击进入 ida动态调试&#xff0c;LStrCatN是一个拼接函数Serial v10 Name …

兴顺物流管理系统pf

TOC springboot539兴顺物流管理系统pf 第一章 课题背景及研究内容 1.1 课题背景 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff…

VAuditDemo审计之安装教学

目录 Xampp安装VAditDemo 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a; 第五步&#xff1a; 第六步&#xff1a; 第七步&#xff1a; 第八步&#xff1a; Xampp安装VAditDemo 第一步&#xff1a; 解压VAuditDemo 先上传好zip文件…

PL3322B 升级为PC3322C

PL3322C 是一款高效率、高集成度、原边调节的电源驱动芯片&#xff0c;PL3322C可去除光耦以及次级控制电路&#xff0c;简化了充电器/适配器等传统的恒流/恒压的设计&#xff0c;高精度的电压和电流调节。PL3322C提供SOT23-6封装&#xff1b;PL3322C集成多种保护功能&#xff0…

ffmpeg6.1集成Plus-OpenGL-Patch滤镜

可参考上一篇文章。ffmpeg6.1集成ffmpeg-gl-transition滤镜-CSDN博客 安装思路大致相同&#xff0c; 因为 Plus-OpenGL-Patch也是基于 ffmpeg 4.x 进行开发的&#xff0c;所以在高版本上安装会有很多报错。 这是我安装后的示例&#xff0c;需要安装教程或者改代码可私信我。 …

工程技术研究杂志工程技术研究杂志社工程技术研究编辑部2024年第12期目录

工程前沿 基于Midas Civil的钢结构人行天桥荷载试验和承载力评价 陈新祥;刘欣;吕美忠; 1-5 基于价值工程理论的基坑支护方案优选 王晓毅;吴军杰; 6-8 建筑工程桩基检测中存在的问题及优化策略研究 张旭;李德君; 9-11 挤密桩参数对黄土地基加固效果的影响研究 杨…

开源介绍 - html2canvas

What is html2canvas &#xff1f; The script allows you to take “screenshots” of webpages or parts of it, directly on the users browser. The screenshot is based on the DOM and as such may not be 100% accurate to the real representation as it does not mak…

Java 入门指南:集合概述

Java集合概述 Java 集合&#xff08;Collections&#xff09;是 Java 中提供的一种容器&#xff0c;用于存储和管理多个对象。与数组不同&#xff0c;集合的长度是可变的&#xff0c;且只能存储对象&#xff08;包括对象的引用&#xff09;&#xff0c;不能存储基本数据类型。…

jmeter中导入java方法并使用

1、首先打开idea&#xff0c;在idea中点击File-New-Project ,创建一个项目&#xff0c;项目名为JmtOne 2、项目创建完成后&#xff0c;直接在main函数中定义两个方法&#xff0c;记住该主函数的包名跟类名&#xff0c;后面会用到&#xff0c;在类中定义了两种拆分字符串的方法&…

FLUX.1 当前支持FLUX.1的Lora模型

首先&#xff0c;我们来梳理一下本次Xlabs-AI团队放出的七款Lora模型&#xff0c;分别是 写实、Furry&#xff08;但是目前该模型还不支持ComfyUI&#xff09;、MJV6、动漫、迪斯尼、风景和艺术风格。每种模型都经过精心训练&#xff0c;能够为 Flux 模型带来卓越的风格转换能…

嵌入式day31

mplayer项目问题分析&#xff1a; 知识短时间内可以获取到 能力的提升一定需要练习 IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 共享内存&#xff1a; 1.是一块 内核预留的空间 2.最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 操作&#xff1a; …

第三方软件测评机构进行安全测试的好处

根据报告显示&#xff0c;2023年全球因网络安全事件造成的损失是8万亿美元&#xff0c;其中70%是由于软件漏洞引起的。这一数据足以表明&#xff0c;企业在软件开发过程中必须重视安全测试。软件安全测试不仅是对软件质量的保障&#xff0c;更是对用户信息和财务安全的保护。 …

QT事件机制理解

事件和信号 从硬件层来看: 事件就是一种中断&#xff0c; 中断的产生形式: 1.用户操控硬件所产生的中断。 2.由系统自身所产生的中断&#xff0c;比如说定时器。 这种中断由系统内核监控&#xff0c;由系统内核接收到中断并向CPU发出的执行请求就叫信号。所以说事件是信号产生…