超详细讲解文件函数
超详细讲解文件函数!!!!
- 字符输入/输出函数
- fgetc
- fputc
- 文本行输入/输出函数
- fgets
- fputs
- 格式化输入/输出函数
- fscanf
- fprintf
- 二进制输入/输出函数
- fread
- fwrite
- 打开/关闭文件函数
- fopen
- fclose
字符输入/输出函数
fgetc

fgetc函数可以从指定的流 stream 获取下一个字符(一个无符号字符),并把位置标识符往前移动。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要在上面执行操作的流;
该函数以无符号 char 强制转换为 int 的形式返回读取的字符,如果到达文件末尾或发生读错误,则返回 EOF。
下面演示了 fgetc函数的用法:
int main ()
{FILE *fp;int c;int n = 0;fp = fopen("file.txt","r");if(fp == NULL) {perror("打开文件时发生错误");return(-1);}do{c = fgetc(fp);if( feof(fp) ){break ;}printf("%c", c);}while(1);fclose(fp);return(0);
}
假设我们有一个文本文件 file.txt,它的内容为:We are in 2019
编译并运行上面的程序,这将产生以下结果:We are in 2019
fputc

fputc函数把参数 char 指定的字符(一个无符号字符)写入到指定的流 stream 中,并把位置标识符往前移动。
char – 这是要被写入的字符。该字符以其对应的 int 值进行传递。(写入文件的字符是ASCII值)
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符的流。
下面演示了 fputc函数的用法:
#include <stdio.h>
int main ()
{FILE *fp;int ch;fp = fopen("file.txt", "w+");for( ch = 33 ; ch <= 100; ch++ ){fputc(ch, fp);}fclose(fp);return(0);
}
让我们编译并运行上面的程序,这将在当前目录中创建文件 file.txt,它的内容如下:
!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcd
//一堆二进制码,文件中无法看明白。
文本行输入/输出函数
fgets

从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (num-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
str – 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
num – 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
如果成功,该函数返回相同的 str 参数。
如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个NULL。如果发生错误,返回一个NULL。
下面的演示了 fgets函数的用法:
int main()
{FILE *fp;char str[60];fp = fopen("file.txt" , "r");if(fp == NULL) {perror("打开文件时发生错误");return(-1);}if( fgets (str, 60, fp)!=NULL ) {/* 向标准输出 stdout 写入内容 */puts(str);}fclose(fp);return(0);
}
假设我们有一个文本文件 file.txt,它的内容如下:
We are in 2023
编译并运行上面的程序,这将产生以下结果:
We are in 2023
fputs

把字符串写入到指定的流 stream 中,但不包括空字符。
str – 这是一个数组,包含了要写入的以空字符终止的字符序列。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
下面的演示了 fputs函数的用法:
#include <stdio.h>int main ()
{FILE *fp;fp = fopen("file.txt", "w+");fputs("这是 C 语言。", fp);fputs("这是一种系统程序设计语言。", fp);fclose(fp);return(0);
}
编译并运行上面的程序,这将创建文件 file.txt,它的内容如下:
这是 C 语言。这是一种系统程序设计语言。
格式化输入/输出函数
fscanf

从流 stream 读取格式化输入。
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
format – 这是 C 字符串,包含了以下各项中的一个或多个:空格字符、非空格字符 和 format 说明符,后面的省略号表明了他可以有多个变量,甚至到无穷个变量。是可变参数列表
format 说明符形式为 [=%[*][width][modifiers]type=],具体讲解如下:
| 参数 | 描述 |
|---|---|
| * | 这是一个可选的星号,表示数据是从流 stream 中读取的,但是可以被忽视,即它不存储在对应的参数中 |
| width | 这指定了在当前读取操作中读取的最大字符数。 |
| modifiers | 为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),或无符号长整型(针对 o、u 和 x),或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g) |
| type | 一个字符,指定了要被读取的数据类型以及数据读取方式。具体参见下一个表格。 |

fscanf 类型说明符:

附加参数,根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
下面演示了 fscanf函数的用法:
#include <stdio.h>
#include <stdlib.h>int main()
{char str1[10], str2[10], str3[10];int year;FILE * fp;fp = fopen ("file.txt", "w+");fputs("We are in 2014", fp);rewind(fp);fscanf(fp, "%s %s %s %d", str1, str2, str3, &year);printf("Read String1 |%s|\n", str1 );printf("Read String2 |%s|\n", str2 );printf("Read String3 |%s|\n", str3 );printf("Read Integer |%d|\n", year );fclose(fp);return(0);
}
编译并运行上面的程序,这将产生以下结果:
Read String1 |We|
Read String2 |are|
Read String3 |in|
Read Integer |2014|
fprintf

发送格式化输出到流 stream 中。、
stream – 这是指向 FILE 对象的指针,该 FILE 对象标识了流。
format – 这是 C 字符串,包含了要被写入到流 stream 中的文本。它可以包含嵌入的 format 标签,format 标签可被随后的附加参数中指定的值替换,并按需求进行格式化。
format 标签属性是 %[flags][width][.precision][length]specifier,具体讲解如下:
| specifier(说明符) | 输出 |
|---|---|
| c | 字符 |
| d 或 i | 有符号十进制整数 |
| e | 使用 e 字符的科学科学记数法(尾数和指数) |
| E | 使用 E 字符的科学科学记数法(尾数和指数) |
| f | 十进制浮点数 |
| g | 自动选择 %e 或 %f 中合适的表示法 |
| G | 自动选择 %E 或 %f 中合适的表示法 |
| o | 有符号八进制 |
| s | 字符的字符串 |
| u | 无符号十进制整数 |
| x | 无符号十六进制整数 |
| X | 无符号十六进制整数(大写字母) |
| p | 指针地址 |
| n | 无输出 |
| % | 字符 |


| width(宽度) | 描述 |
|---|---|
| number | 要输出的字符的最小数目。如果输出的值短于该数,结果会用空格填充。如果输出的值长于该数,结果不会被截断。 |
| * | 宽度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。 |
| precision(精度) | 描述 |
|---|---|
| .number | 对于整数说明符(d、i、o、u、x、X):precision 指定了要写入的数字的最小位数。如果写入的值短于该数,结果会用前导零来填充。如果写入的值长于该数,结果不会被截断。精度为 0 意味着不写入任何字符。1、对于 e、E 和 f 说明符:要在小数点后输出的小数位数。2、对于 g 和 G 说明符:要输出的最大有效位数。3、对于 s: 要输出的最大字符数。默认情况下,所有字符都会被输出,直到遇到末尾的空字符。4、对于 c 类型:没有任何影响。当未指定任何精度时,默认为 1。如果指定时不带有一个显式值,则假定为 0。 |
| .* | 精度在 format 字符串中未指定,但是会作为附加整数值参数放置于要被格式化的参数之前。 |
| length(长度) | 描述 |
|---|---|
| h | 参数被解释为短整型或无符号短整型(仅适用于整数说明符:i、d、o、u、x 和 X)。 |
| I | 参数被解释为长整型或无符号长整型,适用于整数说明符(i、d、o、u、x 和 X)及说明符 c(表示一个宽字符)和 s(表示宽字符字符串)。 |
| L | 参数被解释为长双精度型(仅适用于浮点数说明符:e、E、f、g 和 G)。 |
附加参数 – 根据不同的 format 字符串,函数可能需要一系列的附加参数,每个参数包含了一个要被插入的值,替换了 format 参数中指定的每个 % 标签。参数的个数应与 % 标签的个数相同。
返回值
如果成功,则返回写入的字符总数,否则返回一个负数。
下面的演示了 fprintf函数的用法:
#include <stdio.h>
#include <stdlib.h>
int main()
{FILE * fp;fp = fopen ("file.txt", "w+");fprintf(fp, "%s %s %s %d", "My", "Hero", "is", 2023);fclose(fp);return(0);
}
编译并运行上面的程序,这将创建文件 file.txt,它的内容如下:
My Hero is 2023。
二进制输入/输出函数
fread

从给定流 stream 读取数据到 ptr 所指向的数组中。
ptr – 这是指向带有最小尺寸 size*nmemb 字节的内存块的指针。
size – 这是要读取的每个元素的大小,以字节为单位。
count – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输入流。
下面演示了 fread函数的用法:
int main()
{FILE *fp;char c[] = "This is an apple";char buffer[20];fp = fopen("file.txt", "w+");fwrite(c, strlen(c) + 1, 1, fp);fseek(fp, 0, SEEK_SET);fread(buffer, strlen(c)+1, 1, fp);printf("%s\n", buffer);fclose(fp);return(0);
}
编译并运行上面的程序,将创建一个文件 file.txt,然后写入内容 This is an apple。
fwrite

把 ptr 所指向的数组中的数据写入到给定流 stream 中。
ptr – 这是指向要被写入的元素数组的指针。
size – 这是要被写入的每个元素的大小,以字节为单位。
count – 这是元素的个数,每个元素的大小为 size 字节。
stream – 这是指向 FILE 对象的指针,该 FILE 对象指定了一个输出流。
下面演示了 fwrite函数的用法:
int main ()
{FILE *fp;char str[] = "This is an apple";fp = fopen( "file.txt" , "w" );fwrite(str, sizeof(str) , 1, fp );fclose(fp);return(0);
}
编译并运行上面的程序,这将创建一个文件 file.txt,它的内容如下:This is an apple
打开/关闭文件函数
fopen
使用给定的模式 mode 打开 filename 所指向的文件。

| 文件使用方式 | 含义 | 如果指定文件不存在 |
|---|---|---|
| “r”(只读) | 为了输入数据,打开一个已经存在的 文本文件 | 出错 |
| “w”(只写) | 为了输出数据,打开一个文本文件 | 建立一个新的文件 |
| “a”(追加) | 向文本文件尾添加数据 | 建立一个新的文件 |
| “rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
| “rb”(只读) | 为了输入数据,打开一个二进制文件 | 出错 |
| “wb”(只写) | 为了输出数据,打开一个二进制文件 | 建立一个新的文件 |
| “ab”(追加) | 向一个二进制文件尾添加数据 | 出错 |
| “r+”(读写) | 为了读和写,打开一个文本文件 | 出错 |
| “w+”(读写) | 为了读和写,建议一个新的文件 | 建立一个新的文件 |
| “a+”(读写) | 打开一个文件,在文件尾进行读写 | 建立一个新的文件 |
| “rb+”(读写) | 为了读和写打开一个二进制文件 | 出错 |
| “wb+”(读写) | 为了读和写,新建一个新的二进制文件 | 建立一个新的文件 |
| “ab+”(读写) | 打开一个二进制文件,在文件尾进行读和写 | 建立一个新的文件 |
该函数返回一个 FILE 指针。否则返回 NULL,且设置全局变量 errno 来标识错误。
#include <stdio.h>
#include <stdlib.h>int main()
{FILE * fp;fp = fopen ("file.txt", "w+");fprintf(fp, "%s %s %s %d", "We", "are", "in", 2023);fclose(fp);return(0);
}
运行上述代码,则收获一个带有以下内容的文件 file.txt:We are in 2023
fclose

关闭流 stream,刷新所有的缓冲区。
流成功关闭,则该方法返回零。如果失败,则返回 EOF。
/* fclose example */
#include <stdio.h>
int main ()
{FILE * pFile;pFile = fopen ("myfile.txt","wt");fprintf (pFile, "fclose example");fclose (pFile);return 0;
}
而正因为fclose这个特性,因此我们每次打开文件输入数据后,都必须手动使用fclose关闭文件,否则我们写的数据很有可能会滞留在缓冲区而没有真正存入到硬盘中,当程序结束后就会造成数据丢失。
我们平常使用Word等办公软件的时候本质上就是如此,若不进行保存或者关闭文档后不执行保存操作,我们的数据就会在缓冲区然后丢失而非存储到硬盘之中。

那么,今天的文件函数的使用详解的相关内容我就讲述完啦,因为个人能力有限,文章难免会出现纰漏,届时有错误可以私信发给我以及时更正,谢谢大家!

相关文章:
超详细讲解文件函数
超详细讲解文件函数!!!!字符输入/输出函数fgetcfputc文本行输入/输出函数fgetsfputs格式化输入/输出函数fscanffprintf二进制输入/输出函数freadfwrite打开/关闭文件函数fopenfclose字符输入/输出函数 fgetc fgetc函数可以从指定…...
【挣值分析】
名称解释 拼写解释PV计划费用,预估预算EV挣值,实际预估预算AC实际费用,实际花费CV成本偏差 (EV - AC)SV进度偏差(EV - PV)CPI成本绩效指数 (EV / AC)SPI进度绩效指数 &a…...
Python3-基础语法
Python3 基础语法 编码 默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码: # -*- coding: cp-1252 -*-上述定义允许在源文件中使用 Windows-1252 字符集中的字符编码&…...
【计算机网络】数据链路层(下)
文章目录媒体接入控制媒体接入控制-静态划分信道随机接入 CSMACD协议随机接入 CSMACA协议MAC地址MAC地址作用MAC地址格式MAC地址种类MAC地址的发送顺序单播MAC地址广播MAC地址多播MAC地址随机MAC地址IP地址区分网络编号IP地址与MAC地址的封装位置转发过程中IP地址与MAC地址的变…...
系统分析师考试大纲
系统分析师考试大纲 1.考试目标 通过本考试的合格人员应熟悉应用领域的业务,能分析用户的需求和约束条件,写出信息系统需求规格说明书,制订项目开发计划,协调信息系统开发与运行所涉及的各类人员;能指导制…...
2023上半年软考报名时间已定,你准备好了吗?
港城软考公众号于2023年2月17日发布了2023年度计算机软考工作计划,从该计划内容得知,2023年计算机软考上半年报名3月13日开始,请相关报考人员提前做好报名准备工作。 其他各省市还暂未公布2023上半年软考报名时间,每年都有很多…...
DPDK — Userspace PMD 源码分析
目录 文章目录目录PMD driver 通过 IGB_UIO 与 UIO 进行交互注册一个 UIO 设备PMD 的应用层实现PMD 同样支持中断处理方式PMD driver 通过 IGB_UIO 与 UIO 进行交互 IGB_UIO 内核模块的另一个主要功能就是让用于态的 PMD 网卡驱动程序得以与 UIO 进行交互。对于 PMD 的实现来说…...
javase基础学习(终)
9、网络通信协议 /* InetAddress类的常用方法 1、getLocalHost()public static InetAddress getLocalHost() throws UnknownHostException返回本地主机的地址。 这是通过从系统检索主机的名称,然后将该名称解析为InetAddress 。2、getByName()public static InetAd…...
Scala
1、Scala语言有什么特点?什么是函数式编程?有什么优点? 1、scala语⾔集成⾯向对象和函数式编程 2、函数式编程是⼀种典范,将电脑的运算视作是函数的运算 3、与过程化编程相⽐,函数式编程⾥的函数计算可以随时调⽤&…...
《数据分析方法论和业务实战》读书笔记
《数据分析方法和业务实战》读书笔记 共9章:前两章入门,3-7章介绍基本方法,8章从项目实战介绍数据分析,9章答疑常见问题。 1 数据分析基础 数据分析的完整流程 数据-》信息-〉了解现状-》发现原因-〉获取洞察-》问题机会-〉驱动…...
华为OD机试 - 射击比赛(Python)
射击比赛 题目 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数 请对每个选手按其最高三个分数之和进行降序排名 输出降序排名后的选手 ID 序列 条件如下: 一个选手可以有多个射击成绩的分数 且次序不固定如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽…...
uniapp自定义验证码输入框,隐藏光标
一. 前言 先看下使用场景效果图: 点击输入框唤起键盘,蓝框就相当于input的光标,验证码输入错误或者不符合格式要求会将字体以及边框改成红色提示,持续1s,然后清空数据,恢复原边框样式;5位验证…...
基于SSM框架的生活论坛系统的设计与实现
基于SSM框架的生活论坛系统的设计与实现 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景…...
spring注解使用中常见的概念性问题
Spring注解使用中常见的概念性问题Configuration有什么用?Configuration和XML有什么区别?哪种好?Autowired 、 Inject、Resource 之间有什么区别?Value、PropertySource 和 Configuration?Spring如何处理带Configurati…...
Module理解及使用
ES6的模块化设计思想是静态化,也就是说,在编译的时候确定模块的依赖关系,以及输出输出入的变量。而CommonJS和AMD模块都是在运行时确定的。ES6的模块不是对象,而是通过export显示指定输出的代码,再通过import命令输入。…...
ngix 常用配置之 location 匹配规则
大家好,我是 17。 今天和大家详细聊聊 nginx 的 location 匹配规则 location 匹配规则 匹配规则在后面的 try_files 中有举例 location 按如下优先级匹配 绝对匹配,一个字符也不能差^~ 前缀匹配~(区分大小写), ~*(不…...
chatGPT与人形机器人,高泽龙接受中国经营报采访谈二者发展
1.相较于Chatgpt,人形机器人的市场前景有多大?答:人形机器人的市场前景可以用“无限大”来形容,这看起来很夸张而且并不合理,其实是客观而且中肯的。因为这个问题就仿佛是五十年前,人们问“未来的电脑市场有…...
进程同步——读者-写者问题
读者-写者问题 互斥制约与合作制约双重关系的进程同步问题描述是: 一个被多个进程共享的文件、记录或数据结构,允许进程对其执行读、写操作。读进程称为读者,写进程称为写者。其允许多个进程同时读取,但只要有一个进程在读&#…...
Android自动化配置
1 搭建APPIUM环境 1.1 安装node.js Appium是使用nodejs实现的,所以node是解释器,需要第一步安装好 node.js的安装包下载地址: https://nodejs.org/en/download/ 注意:node.js的安装包的下载在官网有两种版本,建议大…...
Java程序怎么运行?final、static用法小范围类型转大范围数据类型可以吗?
文章目录1.能将int强制转换为byte类型的变量吗?如果该值大于byte类型的范围,将会出现什么现象?2. Java程序是如何执行的?3.final 在 Java 中有什么作用?4.final有哪些用法?5.static都有哪些用法?1.能将int强制转换为…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战
在现代战争中,电磁频谱已成为继陆、海、空、天之后的 “第五维战场”,雷达作为电磁频谱领域的关键装备,其干扰与抗干扰能力的较量,直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器,凭借数字射…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
