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

前言

  • 各位师傅们好,我是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));//6fclose(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,要求处理EOFFILE* fp = fopen("test.txt", "r");if(!fp) {perror("File opening failed");return EXIT_FAILURE;}
//fgetc 当读取失败的时候或者遇到文件结束的时候,都会返回EOFwhile ((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.mzph.cn/pingmian/52076.shtml

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

相关文章

Godot自定义快捷键(配置视图快捷键)

如图 这个没啥技术&#xff0c;但是配置快捷键的时候有讲究如图 选择万国码并且将前后左右下上&#xff08;顶底&#xff09;分别配置为123456。汝等自管记好&#xff0c;今后自有妙用&#xff08;哈哈&#xff09;效果如图

解决电脑突然断网没网,以太网无网络访问权限,本地连接时出错:地址仍未与网络终结点关联

帮同事处理网络问题&#xff0c;尝试了拔插网线&#xff0c;重启电脑&#xff0c;禁用启用以太网&#xff0c;都没有解决。 于是在**命令提示符(cmd)**中执行命令&#xff1a; ipconfig /release 按回车执行后&#xff0c;返回提示&#xff1a;本地连接时出错&#xff1a;地址…

什么是GD32 MCU读保护?

如今电子产品市场风云变幻&#xff0c;暗流汹涌&#xff0c;有没有小伙伴遇到自己费了大力气写出来的代码&#xff0c;很容易就被别人“借鉴”了&#xff0c;真的是让闻者伤心&#xff0c;听着落泪啊。 那有没有什么方法可以防止别人将你的代码从MCU读出来呢&#xff1f;答案当…

大众点评2024年6月全国全分类店铺基础信息数据库

大众点评的采集在2023年之前还是比较好采集的&#xff0c;很多接口不需要登录&#xff0c;即使登录一个帐号也可以采集很多&#xff0c;所以大约2023年8月以前的大众点评店铺字段非常丰富&#xff0c;几乎所有常见店铺字段都能采集。 2023年8月以后&#xff0c;大量接口权限变…

网安新声 | 网易云音乐崩了:网络安全如何守护在线体验

网安加社区【网安新声】栏目&#xff0c;汇聚网络安全领域的权威专家与资深学者&#xff0c;紧跟当下热点安全事件、剖析前沿技术动态及政策导向&#xff0c;以专业视野和前瞻洞察&#xff0c;引领行业共同探讨并应对新挑战的策略与可行路径。 8月19日&#xff0c;#网易云音乐崩…

企业高性能web服务器【Nginx详解】

一.Web 服务基础介绍 1.1 互联网发展历程 1993年3月2日&#xff0c;中国科学院高能物理研究所租用AT&T公司的国际卫星信道建立的接入美国SLAC国家实 验室的64K专线正式开通&#xff0c;成为我国连入Internet的第一根专线。 1995年马云开始创业并推出了一个web网站 中国黄页…

VAuditDemo安装漏洞

目录 VAuditDemo安装漏洞 index.php header.php config.php lib.php install.php 分析结果 漏洞利用 第一步&#xff1a;删除install.lock文件&#xff0c;访问 install.php 抓包 第二步&#xff1a;通过审计构造payload 第三步&#xff1a;修改抓包请求内容&#x…

异常在代码中的两个作用

一.异常的作用: 作用一:异常是用来查询bug的关键参考信息。 作用二:异常可以作为方法内部的一种特殊返回值,以便通知调用者底层的执行情况。 二.举例: 例1: 一个JavaBean类: package com.itheima.a01MyExpection;public class Student { private String name; private int…

【极限性能,尽在掌控】ROG NUC:游戏与创作的微型巨擘

初见ROG NUC&#xff0c;你或许会为它的小巧体型惊讶。然而&#xff0c;这看似不起眼的机身内&#xff0c;蕴藏着游戏、创意的强大能量。 掌中风暴&#xff0c;性能无界 ROG NUC搭载英特尔高性能处理器&#xff0c;配合高速NVMe SSD固态硬盘以及可选的高端独立显卡&#xff08…

“解决Windows电脑无法投影到其他屏幕的问题:尝试更新驱动程序或更换视频卡“

目录 背景: 解决方法1: 解决方法2: 什么是驱动程序&#xff1a; 背景: 今天在日常的工作中&#xff0c; 我想将笔记本分屏到另一个显示屏&#xff0c;我这电脑Windows10系统&#xff0c;当我按下Windows键P键&#xff0c;屏幕信息上提示我"你的电脑不能投影到其他屏幕…

mybatis-plus使用saveOrUpdateBatch函数时数据库中已存在对应id数据,但报错插入时出现重复键

1. 问题背景 ProgramLang pl4 new ProgramLang(); // pl4.setId(100L).setLangName("YY").setDescription("Drama2");pl4.setId(100L);pl4.setLangName("YY");pl4.setDescription("Drama2");List<ProgramLang> updatedE…

调研在深度学习中如何读代码

这里调研了四个up主的内容&#xff0c;对他们讲的内容摘了一下主要的内容。想要看原文的画可以看原篇。 1.如何学习别人的代码&#xff08;代码量较大时&#xff09;_怎么学习别人的代码-CSDN博客 想要掌握的好&#xff0c;光阅读是不够的&#xff0c;一定要动手写、训练模型…

STM32学习9

USART串口协议 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 串口通信 串口是一种应用十分广泛的通讯接口&#xff0c;串口成本低、容易使…

python 可迭代,迭代器,生成器,装饰器

1. 可迭代&#xff08;Iterable&#xff09; 可迭代 是指一个对象可以返回一个迭代器的对象。也就是说&#xff0c;它实现了 __iter__() 方法或 __getitem__() 方法。常见的可迭代对象有列表、元组、字符串、字典和集合。 from collections.abc import Iterablei 100 s &qu…

[Qt][Qt 文件]详细讲解

目录 1.输入输出设备类2.文件读写类3.文件和目录信息类 1.输入输出设备类 在Qt中&#xff0c;⽂件读写的类为QFile&#xff0c;其⽗类为QFileDevice QFileDevice提供了⽂件交互操作的底层功能QFileDevice的⽗类是QIODevice&#xff0c;其⽗类为QObject QIODevice是Qt中所有I/O…

统一待办集成方案:优化工作流,实现高效协作

在现代企业中&#xff0c;待办事项的管理往往分散在多个系统和工具中&#xff0c;这不仅导致信息孤岛&#xff0c;还可能影响工作效率和协作效果。为了解决这些问题&#xff0c;统一待办集成方案应运而生&#xff0c;它通过整合不同的待办事项管理系统&#xff0c;实现统一的任…

做无效私域,比不做还可怕!

这几年&#xff0c;市场上几乎80%的企业都在做同一件事&#xff1a;“私域”营销。 公众号、私域社群、企业微信、视频号……大家用的工具和平台都差不多&#xff0c;但运营效果却是天差地别。为什么很多企业的私域都做不起来&#xff0c;有的企业却做的风生水起&#xff0c;今…

图像识别,图片线条检测

import cv2 import numpy as np # 读取图片 img cv2.imread(1.png)# 灰度化 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 边缘检测 edges cv2.Canny(gray, 100, 200) 当某个像素点的梯度强度低于 threshold1 时&#xff0c;该像素点被认为是非边缘&#xff1b;当梯度强度…

未设置辅助手机的谷歌账号停用,申诉回来后登录需要手机验证,验证两次后成功恢复。

谷歌账号被停用后怎么办&#xff1f;果断申诉&#xff0c;申诉方法和模板等见我前面的文章或视频。 通常申诉以后1-2天会反馈结果&#xff0c;而且大部分&#xff08;80%以上&#xff09;会第一次就被审批通过&#xff0c;如下图所示&#xff1a; 当收到上面这样的邮件&#x…

【机器学习】探索数据矿藏:Python中的AI大模型与数据挖掘创新实践

&#x1f496; 前言&#xff1a;探索数据矿藏1. &#x1f4ca;数据获取与预处理&#xff1a;AI大模型的燃料1.1 &#x1f310;数据获取&#xff1a;多样性与规模并重1.2 &#x1f9f9;数据清洗与处理&#xff1a;提升数据质量1.3 &#x1f50d;特征工程&#xff1a;挖掘数据的深…