文件操作2❤

一:文件的顺序读写

1:顺序读写函数

函数名   功能              适⽤于
fgetc   字符输⼊函数       所有输⼊流
fputc   字符输出函数       所有输出流
fgets   ⽂本⾏输⼊函数     所有输⼊流
fputs   ⽂本⾏输出函数     所有输出流
fscanf  格式化输⼊函数     所有输⼊流
fprintf 格式化输出函数     所有输出流
1.1》fgetc
fgetc
int fgetc ( FILE * stream );

作用;从流中读取字符,即从stream中做指定的文件中取得一个字符且取完一个字符后,stream会自动向下移动一个字节。

返回值:返回所得到的字符,如果读入失败,返回EOF。

1.2》fputc
fputc
int fputc ( int character, FILE * stream );

作用:将单个字符写入文件,将一个字符输出到流。

返回值:如果成功就写入那个字符,如果失败,EOF.

1.3》fgets
fgets
char * fgets ( char * str, int num, FILE * stream )这里的char*str表示指向复制读取的字符串的char数组的指针。用于存储读取到的字符串。num表示要复制str中的最大字符串(包括终止空字符)。表示最大读取的字符数。最后一个则是标识输入流的FILE对象的指针。指定要读取的文件流。

fgets函数会将读取的字符串储存到第一个参数指定的字符数组中,并返回该字符数组的地址。如果读取成功,则会返回字符数组的地址;如果失败,(例如遇到文件结束符或者发生错误)则返回NULL。 

1.4》fputs
fputs
int fputs ( const char * str, FILE * stream );

作用:向指定的文件写入字符串 

str:字符串

stream:文件指针,成功返回非负值,失败返回EOF。

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

作用:将FILE文件流中的数据读写出来。当遇到空格和换行时结束。

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

作用:将格式化的数据,输入到一个流中。

二:文件的随机读取

1:fseek

根据文件指针的位置和偏移量来定位文件指针。

int fseek ( FILE * stream, long int offset, int origin );
第一个参数为流,第二个是偏移量,第三个是文件指针定位的位置。

SEEK_SET以文件开头为中心 

SEEK_CUR是文件指针的当前位置为中心

 SEEK_END文件结尾为中心。

有了fseek函数,可以随心所欲的让文件指针指向想要的位置,以便获得想要的文件内容。

2:ftell

返回文件指针相对于起始位置的偏移量.

long int ftell ( FILE * stream );

这个比较简单就不再详细介绍了。

3:rewind

 让文件指针的位置回到文件的起始位置

void rewind ( FILE * stream );

同上。

三:文件读取结束的判定 

feof是我们的主角。下面我们将详细介绍关于feof的知识。

首先牢记:在文件读取过程中,不能用feof函数的返回值直接来判断文件的是否结束。

feof 的作用是:当文件读取结束的时候,判断是读取结束的原因是否是:遇到文件尾结束。

其次判断文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets ) 例如: • fgetc 判断是否为 EOF . • fgets 判断返回值是否为 NULL .

二进制文件的读取结束判断,判断返回值是否小于实际要读的个数。

四:文件缓冲区

ANSIC 标准采用“缓冲文件系统”处理的数据文件的,所谓缓冲文件系统是指系统自动地在内存中为 程序中每⼀个正在使用的文件开辟一块“文件缓冲区”。从内存向磁盘输出数据会先送到内存中的缓 冲区,装满缓冲区后才⼀起送到磁盘上。如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。缓冲区的大小根据C编译系统决定的。

下面我们可以看一个例子,来进一步了解。

#include <stdio.h>
#include <windows.h>
//VS2019 WIN11环境测试
int main()
{FILE*pf = fopen("test.txt", "w");fputs("abcdef", pf);//先将代码放在输出缓冲区printf("睡眠10秒-已经写数据了,打开test.txt⽂件,发现⽂件没有内容\n");Sleep(10000);printf("刷新缓冲区\n");fflush(pf);//刷新缓冲区时,才将输出缓冲区的数据写到⽂件(磁盘)//注:fflush 在⾼版本的VS上不能使⽤了printf("再睡眠10秒-此时,再次打开test.txt⽂件,⽂件有内容了\n");Sleep(10000);fclose(pf);//注:fclose在关闭⽂件的时候,也会刷新缓冲区pf = NULL;return 0;
}

这里可以得出⼀个结论: 因为有缓冲区的存在,C语言在操作文件的时候,需要做刷新缓冲区或者在文件操作结束的时候关闭文件。如果不做,可能导致读写文件时有问题 。

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

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

相关文章

linux高级管理——LAMP平台部署及应用

一、认识LAMP&#xff1a; 在LAMP平台的四个构成组件中&#xff0c;每个组件都承担着一部分关键应用。经过十几年的发展&#xff0c;各组件间的兼容性得到了不断的完善&#xff0e;协作能力和稳定性也不断增强&#xff0c;可以构建出非常优秀的Web应用系统。各组件的主要作用如…

L1-044:稳赢

题目描述 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;两人同时给出手势&#xff0c;胜负规则如图所示&#xff1a; 现要求你编写一个稳赢不输的程序&#xff0c;根据对方的出招&#xff0c;给出对应的赢招。但是&#xff01;为了不让对方输得太惨&#xff0c;你需要每隔K次…

基于ssm的“游侠”旅游信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本“游侠”旅游信息管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的…

深度学习 Day14——P3天气识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

JMeter逻辑控制器

JMeter逻辑控制器 一、IF控制器1、作用2、步骤 二、循环控制器1、作用2、步骤3、线程组和循环控制器的区别&#xff1f; 三、ForEach控制器1、作用2、步骤 一、IF控制器 1、作用 **控制下面的测试元素是否执行**2、步骤 添加线程组用户定义的变量添加if控制器&#xff0c;判断…

Makefile基础使用与原理

一、基本概念 通常我们编写好代码后&#xff0c;都需要编译&#xff0c;只是这些操作是由IDE来完成&#xff0c;我们只需要点击一个编译按钮。当项目工程越来越庞大&#xff0c;存在几十个甚至更多的文件的时候&#xff0c;你使用的不是IDE工具&#xff0c;而是命令行&#xf…

同时获取el-select的label和value

ui如下&#xff1a; 需求如下&#xff1a; 在点击确认的时候&#xff0c;将id和name都传给一个接口&#xff0c;但是ui只用展示name&#xff0c;name用v-model绑定给input框&#xff0c;但是id不知道怎么传给后端。 解决方法如下&#xff1a; vue中elementUi的el-select同时…

HarmonyOS从简单页面开始

常用基础组件 1 组件介绍 组件&#xff08;Component&#xff09;是界面搭建与显示的最小单位&#xff0c;HarmonyOS ArkUI声明式开发范式为开发者提供了丰富多样的UI组件&#xff0c;我们可以使用这些组件轻松的编写出更加丰富、漂亮的界面。 组件根据功能可以分为以下五大…

C++导出C标准的dll动态库

1 新建项目 1.1 使用VS新建一个空项目 1.2 在属性页中将配置类型改为&#xff1a;动态库(dll) 2 添加头文件 添加文件Api.h&#xff0c;示例代码如下 #pragma once#define DLLEXPORT __declspec(dllexport)extern "C" {DLLEXPORT int getAdd(int a, int b); //求…

Python封装ADB获取Android设备wifi地址的方法

一、代码实现 import subprocessimport re import subprocessfrom common.logger import loggerdef get_device_wifi_address(udid):ip_command fadb -s {udid} shell ip routeresult subprocess.check_output(ip_command, shellTrue, textTrue)# 提取 IP 地址ip_address r…

『番外篇二』Swift “黑魔法”之动态获取类实例隐藏属性的值

概览 在 Swift 代码的调试中,我们时常惊叹调试器的无所不能:对于大部分“黑盒”类实例的内容,调试器也都能探查的一清二楚。 想要自己在运行时也能轻松找到 Thread 实例“私有”属性的值吗(比如 seqNum)? 在本篇博文中您将学到如下内容: 概览1. 借我,借我,一双慧眼吧…

qemu 虚拟机

文章目录 一、参考资料二、QEMU调试参数三、QEMU 命令 一、参考资料 # 查询 qemu 包 apt list | grep qemu# 查询已安装的 qemu 包 apt list --installed | grep qemu # 查询 qemu 版本 qemu-img -V # 安装 sudo apt-get install qemu-system-arm qemu-system-mips qemu-syste…