文件操作(顺序读写篇)

1. 顺序读写函数一览

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

上面说的适用于所有输入流一般指适用于标准输入流和其他输入流(如文件输入流);所有输出流一般指适用于标准输出流和其他输出流(如文件输出流)。

建议先看文件操作(基础知识篇)-CSDN博客


2. fgetc和fputc

2.1 fgetc

该函数可以从流中读取字符。

当读取成功时 ,返回所读到字符的ASCLL码值;当读取失败时(遇到文件末尾或发生其他错误),返回EOF。

由于EOF的类型为int,所以,为了适应这个特殊的返回值,函数的返回类型为int。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "r");if(pf == NULL){printf("%s\n", strerror(errno));//perror("fopen");return 1;}//读文件(字符)int ch = fgetc(pf);//发生错误时返回EOFprintf("%c\n", ch);//读一个字符while((ch = fgetc(pf)) != EOF)//直到读到文件末尾{printf("%c\n", ch);}//关闭文件fclose(pf);pf = NULL;return 0;
}

2.2 fputc

该函数可以将字符输入到流中。

当写入成功时,返回所写入的字符的ASCLL码值;当写入失败时,返回EOF。

同样,该函数的返回值为int。

第一个参数character传入时的类型为int,但是在函数内部,该参数会被转化为unsigned char类型。 

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "w");//写文件时,文件中的数据会被全部清空,不想清除用"a"if(pf == NULL){printf("%s\n", strerror(errno));return 1;}//写文件(字符)char i = 0;for(i = 'a';i <= 'z';i++)//将字符'a'到'z'写入文件{fputc(i, pf);}fclose(pf);pf = NULL;return 0;
}

3. fgets和fputs

3.1 fgets

该函数可以从流中读取字符串。

第一个参数str是存放读取到的字符串的地址,第二个参数num限制最多可读取字符的数量。

当读取成功时(读取到至少一个字符且为发生错误),返回str;当读取失败时(没有读取到任何字符或发生错误),返回NULL且str的内容保持不变。

注意,函数实际能读取的字符数量的最大值为num-1,因为还有一个是'\0'。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "r");if(pf == NULL){printf("%s\n", strerror(errno));return 1;}char arr[20];fgets(arr, 10, pf);//数组,最多读取个数(读取到的字符为i-1,最后一个是\0),文件指针//返回值为字符串地址,失败时返回NULLprintf("%s\n", arr);//关闭文件fclose(pf);pf = NULL;return 0;
}

3.2 fputs

该函数可以将字符串写入流中。

当写入成功时,返回一个非负数;当写入失败时,返回EOF。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>int main()
{FILE* pf = fopen("test.txt", "w");if(pf == NULL){printf("%s\n", strerror(errno));return 1;}fputs("hello world", pf);//换行加\n//关闭文件fclose(pf);pf = NULL;return 0;
}

 

4. fscanf和fprintf

4.1 fscanf

该函数可以从流中读取格式化数据。

可以看到,该函数与scanf的差别在于多了一个参数stream。

scanf针对于标准输入流(对于windows操作系统来说,就是指键盘)进行读取,而fscanf可以从任意输入流中进行读取。

当传入的第一个参数为stdin(标准输入流)时,两函数的作用相同 。

当读取成功时(至少读取到一个格式化数据),返回读取到格式化数据的个数;当读取失败时(在读取到任何数据之前就发生了错误或遇到文件末尾),返回EOF。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "r");if(pf == NULL){perror("fopen");return 1;}//读取文件fscanf(pf, "%s %d %f", s.arr, &(s.age), &(s.score));printf("%s %d %f\n", s.arr, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

4.2 fprintf

该函数可以向流中写入格式化数据。

 同样,该函数相比于printf,多了一个参数stream。

printf针对于标准输出流(对于windows操作系统来说,就是指运行框)进行输出(写入),而fprintf可以将数据写入任意流中。

当传入的第一个参数为stdout(标准输出流)时,两函数的作用相同。

当写入成功时,返回写入数据的个数;当写入失败时(发生错误),返回一个负数。

使用示例:

#include <stdio.h>
#include <string.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("test.txt", "w");if(pf == NULL){perror("fopen");return 1;}fprintf(pf, "%s %d %f", s.arr, s.age, s.score);//关闭文件fclose(pf);pf = NULL;return 0;
}

 

5. fread和fwrite

这两个函数可以将数据以二进制的形式写入文件中,且相比于之前介绍的函数,他们只能对文件进行读取或写入。

5.1 fread

该函数可以从流(文件)中读取二进制的数据。

第一个参数ptr表示存放读取到的数据的空间的起始地址,第二个参数size表示每个数据的大小,第三个参数count表示读取数据的个数。

函数的返回值是成功读取到的数据的个数,如果返回值与count的值不相等,则说明在读取过程中发生了错误或遇到了文件末尾。 

如果size和count中,至少有一个为0,则返回值为0,且文件的状态和ptr指向空间的内容都保持不变。

使用示例:

#include <stdio.h>
#include <string.h>
#include <errno.h>struct S
{char arr[10];int age;float score;
};int main()
{struct S s = {0};FILE* pf = fopen("test.txt", "rb");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;return 0;
}

5.2 fwrite

该函数可以将数据以二进制的形式写入流(文件)中。

第一个参数ptr表示存放要写入数据的空间的起始地址,第二个参数size表示每个数据的大小,第三个参数count表示写入数据的个数。

函数的返回值是是成功写入的数据的个数,如果返回值与count的值不相等,则说明在读取过程中发生了错误。 

如果size和count中,至少有一个为0,则返回值为0。

使用示例:

#include <stdio.h>
#include <string.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("test.txt", "wb");if(pf == NULL){perror("fopen");return 1;}fwrite(&s, sizeof(struct S), 1, pf);//关闭文件fclose(pf);pf = NULL;return 0;
}

5.3 二进制形式读写的优势

1. 文件具有不可读性,存储的信息较为保密。

2. 便于读写自定义类型的数据,如结构体,联合体等。

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

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

相关文章

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测

时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测 目录 时序预测 | Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现GWO-BP灰狼算法优化BP神经网络时间序列预测&#xff08;完整源码和数据…

如何在OceanBase的OCP多节点上获取日志

背景 在使用OceanBase的OCP的过程中&#xff0c;因各种因素&#xff0c;我们可能需要对当前页面进行跟踪。在单一ocp节点环境下&#xff0c;我们自然可以直接在该节点上查找所需的日志。然而&#xff0c;当我们的环境中部署了多个ocp节点时&#xff0c;在排查问题时就会变得相…

WPF中获取TreeView以及ListView获取其本身滚动条进行滚动

实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) TreeView:TreeViewAutomationPeer lvap new TreeViewAutomationPeer(treeView); var svap lvap.GetPattern(PatternInterface.Scroll) as ScrollViewerAutomationPeer; var scroll svap.Owner as ScrollVie…

sql Tuning Advisor启用导致业务性能问题

数据库每天晚上10点后业务性能很卡&#xff0c;大量的insert被堵塞&#xff0c;查询等待事件发现有大量的“library cache lock”和“cursor: pin S wait on X”。 22:00数据库的统计信息开始收集&#xff0c; Sql Tuning Advisor堵塞了统计信息的收集&#xff0c;等待事件是“…

Python之Opencv教程(1):读取图片、图片灰度处理

1、Opencv简介 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个用于计算机视觉和图像处理的开源库&#xff0c;提供了丰富的图像处理、计算机视觉和机器学习功能。它支持多种编程语言&#xff0c;包括C、Python、Java等&#xff0c;广泛应用于图像处…

Redis 的慢日志

Redis 的慢日志 Redis 的慢日志&#xff08;Slow Log&#xff09;是用于记录执行时间超过预设阈值的命令请求的系统。慢日志可以帮助运维人员和开发人员识别潜在的性能瓶颈&#xff0c;定位那些可能导致 Redis 性能下降或响应延迟的慢查询。以下是 Redis 慢日志的相关细节&…

Linux IRC

目录 入侵框架检测 检测流程图 账号安全 查找账号中的危险信息 查看保存的历史命令 检测异常端口 入侵框架检测 1、系统安全检查&#xff08;进程、开放端口、连接、日志&#xff09; 这一块是目前个人该脚本所实现的功能 2、Rootkit 建议使用rootkit专杀工具来检查&#…

【算法-PID】

算法-PID ■ PID■ 闭环原理■ PID 控制流程■ PID 比例环节&#xff08;Proportion&#xff09;■ PID 积分环节&#xff08;Integral&#xff09;■ PID 微分环节&#xff08;Differential&#xff09; ■ 位置式PID&#xff0c;增量式PID介绍■ 位置式 PID 公式■ 增量式 PI…

嵌入式数据库-Sqlite3

阅读引言&#xff1a; 本文将会从环境sqlite3的安装、数据库的基础知识、sqlite3命令、以及sqlite的sql语句最后还有一个完整的代码实例&#xff0c; 相信仔细学习完这篇内容之后大家一定能有所收获。 目录 一、数据库的基础知识 1.数据库的基本概念 2.常用数据库 3.嵌入式…

wordpress插件,免费的wordpress插件

WordPress作为世界上最受欢迎的内容管理系统之一&#xff0c;拥有庞大的插件生态系统&#xff0c;为用户提供了丰富的功能扩展。在内容创作和SEO优化方面&#xff0c;有一类特殊的插件是自动生成原创文章并自动发布到WordPress站点的工具。这些插件能够帮助用户节省时间和精力&…

Hides for Mac:应用程序隐藏工具

Hides for Mac是一款功能强大的应用程序隐藏工具&#xff0c;专为Mac用户设计。它能够帮助用户快速隐藏当前正在运行的应用程序窗口&#xff0c;保护用户的隐私和工作内容&#xff0c;避免不必要的干扰。 软件下载&#xff1a;Hides for Mac下载 Hides for Mac的使用非常简单直…

初步了解C++

目录 一&#xff1a;什么是C&#xff1f; 二.C发展史 三:C关键字 四&#xff1a;命名空间 4.1命名空间的介绍 4.2命名空间的使用 4.3命名空间的使用 4.3.1使用作用域限定符 4.3.2 使用using将命名空间的某个成员引入 4.3.3使用using把整个命名空间展开 4.4命名空…

BaseDao封装增删改查

文章目录 什么是BaseDao操作代码增删改查询单个数据查询多个数据 总结 什么是BaseDao BaseDao是&#xff1a; 数据库里负责增加&#xff0c;删除&#xff0c;修改&#xff0c;查询 具体来说是一种接口代码,公共方法的接口类。 在dao层新建basedao,其他dao层接口继承basedao 相…

BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名空间或类型不包含任何公共成员

BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名空间或类型不包含任何公共成员&#xff0c;或者找不到该命名空间或类型。 问题描述原因分析 解决办法 ) 问题描述 严重性 代码 说明 项目 文件 行 警告 BC40056 Imports“SolidWorks.Interop.swconst”中指定的命名…

基于SSM框架的校园失物招领系统:从设计思路到实现细节

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

Java代码基础算法练习-自定义函数之字符串连接-2024.03.30

任务描述&#xff1a; 写一函数&#xff0c;将两个字符串连接起来&#xff0c;然后在主函数中调用该函数实现字符串连接操作。 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.Scanner;public class m240330 {public static void main(Stri…

Python 妙用运算符重载——玩出“点”花样来

目录 运算符重载 主角点类 魔法方法 __getitem__ __setitem__ __iter__ __next__ __len__ __neg__ __pos__ __abs__ __bool__ __call__ 重载运算符 比较运算符 相等 不等 ! 大于和小于 >、< 大于等于和小于等于 >、< 位运算符 位与 & 位…

腾讯 tengine 替代 nginx

下载地址 变更列表 - The Tengine Web Server 解压 tar -xvf 安装包.gz 进入到解压目录 cd 解压目录 使用 ./configure 命令来指定安装目录,这边指定安装到 /opt/tengine/install路径下 新建install目录 ./configure --prefix/opt/tengine/install 检查是否有缺失的依…

LM算法探寻——答案在022浙江大学信号与系统

LM算法详解 | 宇尘 (gitee.io) 求函数最小值&#xff0c;从另一个角度理解是求误差最小值。 梯度 最陡梯度下降算法和LMS算法原理介绍及MATLAB实现_lms滤波器中的梯度下降-CSDN博客 均值即平均值 (3 封私信 / 56 条消息) FIR滤波器中的冲激响应怎么理解&#xff1f; 和滤波有…

嵌入式linux学习之交叉编译器安装

交叉编译器介绍 ARM 裸机、Uboot 移植、Linux 移植这些都需要在 Ubuntu 下进行编译&#xff0c;编译就需要编译器&#xff0c;在 Liux 进行 C 语言开发里面使用 GCC 编译器进行代码编译&#xff0c;但是 Ubuntu 自带的 gcc 编译器是针对 X86 架构的&#xff01;而我们现在要编…