C语言:文件操作(中)

ops/2025/2/12 2:13:58/

片头

嗨!小伙伴们,大家好!在上一篇中,我们学习了C语言:文件操作(上),在这一篇中,我们将继续学习文件操作,准备好了吗?Ready Go ! ! !

 文件的顺序读写

来复习一下这个表格

函数名功能适用于
fgetc字符输入函数/读所有输入流(stdin-标准输入流和文件输入流)
fputc字符输出函数/写所有输出流(stdout-标准输出流和文件输出流)
fgets文本行输入函数所有输入流
fputs文本行输出函数所有输出流
fscanf格式化输入函数所有输入流
fprintf格式化输出函数所有输出流
fread二进制输入文件输入流
fwrite二进制输出文件输出流

在上一篇中,我们学习了fgetc、fputc、fgets、fputs函数,今天我们来讲解后面几个函数~

1 fprintf函数

fprintf函数是C语言标准库中的一个输出函数,用于将格式化的数据输出到指定的文件中。

函数声明如下:

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

 参数意义如下:

stream: 表示文件指针,用于指定输出的目标文件

format: 是一个格式化字符串,指定输出的格式

....... : 表示可变参数,用于提供要输出的数据

通过对比,我们可以观察到,fprintf函数和printf函数差不多, fprintf函数只不过多了一个参数FILE* stream,printf函数是将数据输出到标准输出流(stdout)【类似于:显示器界面(控制台)】,而fprintf函数是将数据输出到指向文件的指针stream(指针类型为 FILE*)中。

代码如下:

#include<stdio.h>
//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};int main() {//定义一个结构体变量s,分别对属性进行初始化struct Stu s = { "zhangsan",24,98.00000 };//以“只写”的方式打开文件FILE* pfwrite = fopen("data.txt", "w");if (pfwrite == NULL) {perror("fopen->pfwite");return 1;}//将信息输出到流中fprintf(pfwrite,"%s %d %.1f", s.name, s.age, s.score);//关闭文件fclose(pfwrite);pfwrite = NULL;//置空return 0;
}

运行结果如下:

fprintf函数的返回值是成功输出的字符数。如果出现错误则返回负数。函数会根据format字符串中的格式指示符,将可变参数列表中的数据按照指定的格式输出到文件中。

2 fscanf函数

fscanf函数是C语言标准库中的一个输入函数,用于从文件中读取格式化的数据。它可以根据给定的格式字符串从文件中读取数据,并将读取到的数据存储到对应的变量中。

函数原型如下:

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

参数说明:
- stream:指向要读取的文件的指针。
- format:格式化字符串,指定了要读取的数据的格式。
- ...:可变参数,用来接收读取到的数据的变量。

通过对比,我们可以发现,其实 fscanf 函数和 scanf 函数差不多,fscanf函数只不过多了一个参数FILE* stream,scanf函数是从标准输入流(从键盘中)读取数据,fscanf函数是从指向文件的指针stream(指针类型为 FILE*)中读取数据。

代码如下:

#include<stdio.h>//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};
int main() {
//定义一个结构体变量s,初始化为0struct Stu s = { 0 };
//以“只读”的模式,打开文件FILE* pfread = fopen("data.txt", "r");
//从文件中读取属性值fscanf(pfread,"%s %d %f", s.name, &(s.age), &(s.score));
//在控制台上打印属性值fprintf(stdout,"%s %d %.1f", s.name, s.age, s.score);//关闭文件fclose(pfread);pfread = NULL;//置空return 0;
}

运行结果如下:

这样,我们就成功地使用fscanf函数从文件中读取了数据。需要注意的是,fscanf函数会按照格式化字符串中的格式要求进行读取,如果格式不匹配,可能会导致读取错误或结果不正确。因此,在使用fscanf函数时,要确保格式化字符串与文件中的数据格式相匹配。 

3 fwrite函数

fwrite函数是C语言中的一个文件操作函数,用于向文件中写入数据。

函数原型如下:

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

参数含义如下:

ptr: 指向要写入的数据的指针

size: 每个数据项的大小(以字节为单位) 

count: 要写入的数据项的个数

stream: 指向要写入的文件的指针

返回值: 成功写入数据的个数

fwrite函数将指定的数据写入文件,写入的数据来自指针ptr指向的内存区域。写入的数据项大小为size字节,总共写入count个数据项。函数调用成功后,返回实际写入的数据项个数,如果返回值与count不相等,可能是因为写入出错或到达文件末尾。

fwrite函数一般用于向二进制文件中写入数据,例如将内存中的结构体保存到文件中。它可以写入任意类型的数据,包括整数、浮点数、字符等。

代码如下:

//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};int main() {//定义一个结构体变量s,分别对属性进行初始化struct Stu s = { "zhangsan",18,95.00000 };//以二进制的模式读和写FILE* pf = fopen("data.txt", "wb");if (pf == NULL) {perror("pf");return 1;}//二进制输出到流中fwrite(&s, sizeof(s), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果如下:

 

4 fread函数

 fread函数时C语言中的文件输入函数,用于从文件中读取指定数量的数据项,并将其存储到指定的内存块中。它的函数原型如下:

size_t fread(void* ptr,size_t size,size_t count,FILE* stream)

 参数说明:

ptr: 指向存储数据的内存块的指针。

size: 每个数据项的字节数。

count: 要读取的数据项的数量

stream: 文件指针,指向要读取的文件。

返回值:为实际读取的数据项数量。

fread函数按照指定的size和count来计算要读取的总字节数,并将这些字节从文件中读取到ptr指向的内存块中。读取的位置随着每次读取而向后移动。

fread函数常用于读取二进制文件,可以读取任意类型的数据。读取字符串时,需要注意字符串结束标志'\0'字符,因为fread函数不会自动追加字符串结束符。

代码如下:

//创建一个结构体Stu
struct Stu {char name[20];int age;float score;
};//定义一个结构体变量s,初始化为0
int main() {struct Stu S = { 0 };FILE* pf = fopen("data.txt", "rb");if (pf == NULL) {perror("pf");return 1;}//以二进制的形式读文件fread(&S, sizeof(S), 1, pf);//输出属性值printf("%s %d %f\n", S.name, S.age, S.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

运行结果如下:

 片尾

今天我们学习了另外4个函数,分别是fprintf函数,fscanf函数,fwrite函数,fread函数,希望看完这篇文章能对友友们有所帮助!!!

点赞收藏加关注!!!

谢谢大家!!!


http://www.ppmy.cn/ops/30340.html

相关文章

【七十六】【算法分析与设计】2435. 矩阵中和能被 K 整除的路径,87. 扰乱字符串,三维动态规划

2435. 矩阵中和能被 K 整除的路径 给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发&#xff0c;每一步只能往 下 或者往 右 &#xff0c;你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的路径数目&#xff0c;由于答案可能很大…

CSS 伪类、伪元素的应用实例:电池充电、高能进度条

一、目的 本文通过 CSS 伪类、伪元素&#xff0c;结合动画 animation 和 Vue 动态样式属性&#xff08;通过 CSS 变量&#xff09;的写法&#xff0c;来实现电池充电、高能进度条的效果&#xff0c;如下图所示。 二、基础知识 1、CSS 伪类、伪元素 简单概括成以下 4 点&#x…

ProxyFactoryBean的作用

ProxyFactoryBean ProxyFactoryBean是spring ioc环境中创建AOP应用的底层方法&#xff0c;通过它完成了对AOP的封装 Aop生成过程 public Object getObject() throws BeansException { // 初始化通知器链 initializeAdvisorChain(); // 单例 if (isSingleton()) { re…

HTML中input输入框(详解输入框的用法)

目录 一、input介绍 1.概念 2.好处 3.用法 4.应用 二、input语法 1.文本输入框 (type"text") 2.密码输入框 (type"password") 3.数字输入框 (type"number") 4.电子邮件输入框 (type"email") 5.复选框 (type"checkbox&…

邊緣智能2024—AI開發者峰會(5月9日)數碼港即將啟幕

隨著 AI &#xff08;人工智能&#xff09;技術的飛速發展&#xff0c;我們正迎來邊緣計算智能化與分布式AI深度融合的新時代&#xff0c;共同演繹分布式智能創新應用的壯麗篇章。"邊緣智能2024 - AI開發者峰會"將聚焦於這一前沿領域&#xff0c;探討如何通過邊緣計算…

【Unity Shader入门精要 第3章】Unity Shader基础

1. Unity提供的四种shader模板 Standard Surface Shader&#xff1a;unity自己创建的shader类型&#xff0c;提供了基本的光照处理逻辑&#xff0c;使用者不需要自己实现vertext/fragment着色器&#xff0c;只要指定光照模型&#xff0c;unity会自动编译生成对应的vertext/fra…

Mac好用又好看的终端iTerm2 + oh-my-zsh

Mac好用又好看的终端iTerm2 1. iTerm2的下载安装2. oh-my-zsh的安装2.1 官网安装方式2.2 国内镜像源安装方式 3. oh-my-zsh配置3.1 存放主题的路径3.2 存放插件的路径3.3 配置文件路径 1. iTerm2的下载安装 官网下载&#xff1a; iTerm2 2. oh-my-zsh的安装 oh-my-zsh是一…

[方法] Unity 实现仿《原神》第三人称跟随相机 v1.0

参考网址&#xff1a;【Unity中文课堂】RPG战斗系统Plus 在Unity游戏引擎中&#xff0c;实现类似《原神》的第三人称跟随相机并非易事&#xff0c;但幸运的是&#xff0c;Unity为我们提供了强大的工具集&#xff0c;其中Cinemachine插件便是实现这一目标的重要工具。Cinemachi…