C语言——文件操作(看这一篇就够了)

1、为什么使用文件?

我们前面学习结构体,在写通讯录的时候会发现一个问题,我们向通讯录里面录入数据,当程序退出的时候,记录的数据也随之没有了,等下次我们在再调用通讯录时,又得重新录入数据,那也太不方便了。

所以我们就应该弄出来一个可以保存信息的通讯录,将录入的数据存在磁盘文件里,这样我们才真正的做到了数据的持久化。

2、什么是文件?

磁盘上的文件是文件

但是在程序设计中,我们一般谈及的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)

2.1程序文件

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

2.2数据文件

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

本章讨论的是数据文件,在此之前我们接触到的C语言可能都是以终端的键盘为输入输出的对象,而能进行输入输出的不仅仅有终端,我们也可以从文件中读取数据,也可以将内容输出到文件中。

 

2.3文件名

一个文件要有一个唯一的文件标识,以便用户识别和引用。

文件名包含三个部分:文件路径+文件主干+文件后缀

例如:c:\code\test.txt

为了方便起见,通常将文件标识称为文件名

3、文件的打开和关闭

3.1文件指针

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

每当打开一个文件的时候,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必要在意其中的细节。

而通过文件指针变量对其进行管理会更加方便。

下面我们定义一个文件指针:

FILE* pf;//文件指针变量

我们只需要在程序中调用这个文件指针变量,就可以找到相应的文件。

 

3.2文件的打开和关闭

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

 那么具体有哪些打开方式呢?下面有五个重要常用的打开方式:

文件使用方式含义如果指定文件不存在
"r"(只读)为了输入数据,打开一个已经存在的文本文件出错
"w"(只写)为了输出数据,打开一个一个文本文件建立一个新的文件
"a"(追加)向文本文件尾添加数据建立一个新的文件
"rb"(只读)为了输入数据,打开一个二进制文件出错
"wb"(只写)为了输出数据,打开一个二进制文件建立一个新的文件

当然fopen函数也是有可能被打开失败的,当打开失败的话,将会返回一个空指针


那么实践中,代码是如何具体实现的呢?

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

 

4、文件的顺序读写

顺序读写函数介绍

功能函数名适用于
字符输入函数fgetc所有输入流
字符输出函数fputc所有输出流
文本行输入函数fgets所有输入流
文本行输出函数fputs所有输出流
格式化输入函数fscanf所有输入流
格式化输出函数fprintf所有输出流
二进制输入fread文件
二进制输出fwrite文件

 

这是一组对文件进行读写字符的函数:

/* fopen fclose example */
#include <stdio.h>int main(){FILE* pFile;//打开文件pFile = fopen("myfile.txt", "r");if (pFile == NULL) {perror("fopen");return 1;}fputc('a', pFile);fputc('b', pFile);fputc('c', pFile);fputc('d', pFile);int ch = fgetc(pFile);printf("%c ", ch);ch = fgetc(pFile);printf("%c ", ch);ch = fgetc(pFile);printf("%c ", ch);ch = fgetc(pFile);printf("%c ", ch);fclose(pFile);pFile = NULL;return 0;}

我们可以看到我们在进行,写文件的操作时,确实在文件myfile.txt里写入了abcd,然后我们再进行读文件的操作时,也可以在终端上看到abcd,所以这就是读写文件操作和结果。 

 注:fgetc在读取文件时,成功则返回相应的字符,失败的话返回的是EOF 

所以我们读文件也可以这样:

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>/* fopen fclose example */
#include <stdio.h>int main(){FILE* pFile;//打开文件pFile = fopen("myfile.txt", "r");if (pFile == NULL) {perror("fopen");return 1;}fputc('a', pFile);fputc('b', pFile);fputc('c', pFile);fputc('d', pFile);//读取int ch = 0;while ((ch = fgetc(pFile)) != EOF){printf("%c ", ch);}fclose(pFile);pFile = NULL;return 0;}

int main()
{FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件//fputs("hello", pf);char arr[] = "hello";fputs(arr, pf);fputs("world", pf);fclose(pf);pf = NULL;return 0;
}
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件char arr[100] = {0};fgets(arr, 100, pf);printf("%s", arr);fgets(arr, 100, pf);printf("%s", arr);fclose(pf);pf = NULL;return 0;
}

这一组函数的功能是可以对字符串进行读写操作。 

 

#include<stdio.h>
struct S
{float f;char c;int n;
};int main()
{struct S s = { 3.14f, 'w', 100 };FILE* pf = fopen("data.txt", "w");if (pf == NULL){perror("fopen");return 1;}//写文件fprintf(pf, "%f-%c-%d", s.f, s.c, s.n);fclose(pf);pf = NULL;return 0;
}
#include<stdio.h>
struct S
{float f;char c;int n;
};int main()
{struct S s = {0};FILE* pf = fopen("data.txt", "r");if (pf == NULL){perror("fopen");return 1;}//读文件fscanf(pf, "%f-%c-%d", &(s.f), &(s.c), &(s.n));printf("%f-%c-%d\n", s.f, s.c, s.n);fclose(pf);pf = NULL;return 0;
}

这一组函数功能可以将带有特殊格式的进行读写操作。 

#include<stdio.h>
//二进制的方式写进文件
int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };//写文件FILE*pf = fopen("data.txt", "wb");if (pf == NULL){perror("fopen");return 1;}//二进制的写文件fwrite(arr, sizeof(arr[0]), sizeof(arr)/sizeof(arr[0]), pf);fclose(pf);pf = NULL;return 0;
}

 

#include<stdio.h>
//二进制的方式读取文件
int main()
{int arr[10] = {0};//写文件FILE* pf = fopen("data.txt", "rb");if (pf == NULL){perror("fopen");return 1;}//二进制的读文件fread(arr, sizeof(arr[0]), sizeof(arr) / sizeof(arr[0]), pf);int i = 0;for (i = 0; i < 10; i++){printf("%d ", arr[i]);}fclose(pf);pf = NULL;return 0;
}

 这一组是以二进制的形式进行读写文件的

5、文件的随机读写

5.1fseek

 

5.2ftell

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//cch = fgetc(pf);printf("%c\n", ch);//dch = fgetc(pf);printf("%c\n", ch);//eint pos = ftell(pf);printf("pos = %d\n", pos);fclose(pf);pf = NULL;return 0;
}

 这个函数就是可以查看,当前文件指针指向了什么地方,从起始位置开始的偏移量。

5.3rewind

#include<stdio.h>
int main()
{FILE* pf = fopen("data.txt", "r");if (pf == NULL) {perror("fopen");return 1;}int ch = fgetc(pf);printf("%c\n", ch);//ach = fgetc(pf);printf("%c\n", ch);//bch = fgetc(pf);printf("%c\n", ch);//cch = fgetc(pf);printf("%c\n", ch);//dch = fgetc(pf);printf("%c\n", ch);//erewind(pf);ch = fgetc(pf);printf("%c\n", ch);//afclose(pf);pf = NULL;return 0;
}

 这个函数可以让文件指针重置到起始位置。

6、文本文件和二进制文件

7、文本读取结束时的判定

7.1被错误使用的feof

8、文件缓冲区

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

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

相关文章

Java基于SpringBoot的学科竞赛系统,附源码,文档

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

ctfshow web71

开启环境&#xff1a; c?><?php $anew DirectoryIterator("glob:///*"); foreach($a as $f) {echo($f->__toString(). );} exit(0); ?> cinclude("/flagc.txt");exit();

网络和Linux网络_15(IO多路转接)reactor编程_服务器+相关笔试题

目录 1. reactor的服务器 1.1 Sock.hpp 1.2 加协议分割报文 1.3 序列化和反序列化 Protocol.hpp main.cc Epoll.hpp TcpServer.hpp 2. 相关笔试题 答案及解析 本篇完。 1. reactor的服务器 Log.hpp和以前一样&#xff0c;因为下面要写ET模式所以Sock.hpp加了一个把…

solr的原理是什么

1 Java程序里如果有无限for循环的代码导致CPU负载超高&#xff0c;如何排查&#xff1f; 排查Java程序中由于无限循环导致的CPU负载过高的问题&#xff0c;可以按照以下步骤进行&#xff1a; 资源监控&#xff1a; 使用系统命令行工具&#xff08;如Linux上的top或htop&#xf…

二、防御保护---防火墙基础知识篇

二、防御保护---防火墙基础知识篇 一、什么是防火墙二、防火墙的发展史1.包过滤防火墙(一个严格的规则表)2.应用代理防火墙(每个应用添加代理)3.状态检测防火墙(首次检查建立会话表)3.入侵检测系统(IDS)-----网络摄像头4.入侵防御系统(IPS)-----抵御2-7层已知威胁5.防病毒网关(…

Python---网络编程知识详解(学习笔记)基础部分

目录 一、IP地址 1.引入IP地址 2.ip地址的分类 2.1 IPv4的5种类别以及共有IP和私有IP 2.1.1 按照基本格式划分 2.1.2 按照功能用途来划分 2.1.2 特殊的P地址 一、IP地址 1.引入IP地址 特点&#xff1a;在逻辑上标记一台电脑&#xff08;唯一标记&#xff09; 作用&…

【Midjourney】如何自定义一套参数

使用Midjourney有时候会遇到需要调整某些参数的时候&#xff0c;例如宽高之类的&#xff1a; --hd --ar 7:4 而Midjourney中提供了一条指令用于自定义一套参数方便重复使用。 以下指令创建一个名为“mine”的选项&#xff0c;翻译过来就是 --hd --ar 7:4: 创建成功后会有类似…

【C++版】排序算法详解

目录 直接插入排序 希尔排序 选择排序 冒泡排序 堆排序 快速排序 hoare法 挖坑法 前后指针法 非递归版本 快速排序中的优化 归并排序 递归版本 非递归版本 计数排序 总结 直接插入排序 直接插入排序的思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入…

【EI会议征稿通知】第五届计算机信息和大数据应用国际学术会议(CIBDA 2024)

第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09; 2024 5th International Conference on Computer Information and Big Data Applications 第五届计算机信息和大数据应用国际学术会议&#xff08;CIBDA 2024&#xff09;将于2024年3月22-24日在…

运行VUE提示找不到模块validate-engines.js...

原来好好的&#xff0c;突然提示找不到模块validate-engines.js&#xff0c;CMD命令行输入npm -v不是内部或外部命令&#xff0c;node -v可以查看到版本号。 解决&#xff1a; 1. 卸载nodejs&#xff0c;重新下载安装文件&#xff1a;下载nodejs 2. 到目录&#xff1a;C:\Us…

深度学习与神经网络Pytorch版 3.2 线性回归从零开始实现 1.生成数据集

3.2 线性回归从零开始实现 目录 3.2 线性回归从零开始实现 一 &#xff0c;简介 1. 原理 2. 步骤 3. 优缺点 4. 应用场景 二 &#xff0c;代码展现 1. 生成数据集(完整代码) 2. 各个函数解析 2.1 torch.normal()函数 2.2 torch.matmul()函数 2.3 d2l.plt.scatter(…

18.通过telepresence调试部署在Kubernetes上的微服务

Telepresence简介 在微服务架构中,本地开发和调试往往是一项具有挑战性的任务。Telepresence 是一种强大的工具,使得开发者本地机器上开发微服务时能够与运行在 Kubernetes 集群中的其他服务无缝交互。本文将深入探讨 Telepresence 的架构、运行原理,并通过实际的案例演示其…

在mgre环境下配置ospf

实验规则如上图所示&#xff1a; 首先规划IP 配置缺省路由&#xff0c;使得公网全网可达 此处在r1上进行配置&#xff1a; 由此可以实现&#xff0c;公网已经全网可达&#xff1a; 其次&#xff0c;再分配 全连的MGRE网段&#xff0c;全连的MGRE网段每个路由器都是中心站点&…

基于springboot招聘信息管理系统源码和论文

在Internet高速发展的今天&#xff0c;我们生活的各个领域都涉及到计算机的应用&#xff0c;其中包括招聘信息管理系统的网络应用&#xff0c;在外国招聘信息管理系统已经是很普遍的方式&#xff0c;不过国内的线上管理系统可能还处于起步阶段。招聘信息管理系统具有招聘信息管…

配置nginx作为静态文件托管服务器

下载nginx windows上是个压缩包 解压后, 使用命令行输入 nginx 进行启动 nginx -s stop 进行停止 nginx -s status 查看状态 可以配置一下环境变量 主要是配置文件, windows的nginx配置文件在 conf文件夹下 在http标签下 添加如下配置 其他地方不用更改,保持原样即可, 以…

git diff查看比对两次不同时间点提交的异同

git diff查看比对两次不同时间点提交的异同 用 git diff命令&#xff1a; git diff commit-id-1 commit-id-2 不同commit-id在不同的时间点提交产生&#xff0c;因为也可以认为git diff是比对两个不同时间点的代码异同。 git diff比较不同commit版本的代码文件异同_git diff c…

2024年航海制造工程与海洋工程国际会议(ICNMEME2024)

一、【会议简介】 2024年航海制造工程与海洋工程国际会议(ICNMEME2024)旨在将研究人员、工程师、科学家和行业专业人士聚集在一个开放论坛上&#xff0c;展示他们在导航制造工程与海洋工程领域的激励研究和知识转移理念。然而&#xff0c;我们也认识到&#xff0c;工程师的未来…

代码随想录算法训练营第二十天 |654.最大二叉树,617.合并二叉树,700.二叉搜索树种的搜索,98.验证二叉搜索树(待补充)

654.最大二叉树 1、题目链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 2、文章讲解&#xff1a;代码随想录 3、题目&#xff1a; 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下&#xff1a; 二叉树的…

petalinux2022.2启动文件编译配置

安装必要运行库: sudo apt-get install iproute2 gawk python3 python sudo apt-get install build-essential gcc git make net-tools libncurses5-dev tftpd sudo apt-get install zlib1g-dev libssl-dev flex bison libselinux1 gnupg wget git-core diffstat sudo apt-ge…

react实现滚动到顶部组件

新建ScrollToTop.js import React, { useState, useEffect } from react; import ./ScrollToTop.css;function ScrollToTop() {const [isVisible, setIsVisible] useState(true);// Show button when page is scorlled upto given distanceconst toggleVisibility () > {…