C语言文件操作收尾【随机读写 + 结束判定 + 文件缓冲区】

全文目录

  • 前言
  • `fseek` 重定位位置指示器函数
  • `ftell` 获取当前文件指示器的位置
  • `rewind` 重置位置指示器
  • 文本文件和二进制文件
  • 文件读取结束的判定
    • `feof` 和 `ferror`
  • 文件缓冲区
  • 总结

前言

有了文件的顺序读写基础,那么肯定会好奇文件的随机读写,毕竟顺序读写对于有些操作场景来说实在是不方便。

文件指针之所以能够顺序读写是因为文件类型内部有一个位置指示器,我们只能对位置指示器指向的地方进行读写。

文件的随机读写就是将文件的位置指示器设置成我们想要的值,然后进行读写操作。

fseek 重定位位置指示器函数

函数描述:

在这里插入图片描述

设置位置指示器的位置

其中的 offset 可以是负数, origin 只能是上面三个宏。

// demo
// test.txt :> "abcdef"printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
fseek(pf, 2, SEEK_CUR);
printf("%c", fgetc(pf)); // f

ftell 获取当前文件指示器的位置

函数描述:

在这里插入图片描述

返回流的当前位置指示器的位置

返回值Return Value

成功时,返回位置指示器的当前值。

失败时,返回-1Lerrno设置为系统特定的正值。

// demo
// test.txt :> "abcdef"printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
printf("%d\n", ftell(pf)); // 3

rewind 重置位置指示器

函数描述:

在这里插入图片描述

将与流关联的位置指示器设置为文件的开头

// demo
// test.txt :> "abcdef"printf("%c", fgetc(pf)); // a
printf("%c", fgetc(pf)); // b
printf("%c", fgetc(pf)); // c
printf("%d\n", ftell(pf)); // 3
rewind(pf);
printf("%d\n", ftell(pf)); // 0

文本文件和二进制文件

根据数据的组织形式,数据文件被称为文本文件或者二进制文件。

数据在内存中以二进制的形式存储,如果不加转换的输出到外存,就是二进制文件。

如果要求在外存上以ASCII码的形式存储,则需要在存储前转换。以ASCII字符的形式存储的文件就是文本文件。

数据在内存中的存储形式:

字符一律以ASCII形式存储,数值型数据既可以用ASCII形式存储,也可以使用二进制形式存储。

如有整数10000,如果以ASCII码的形式输出到磁盘,则磁盘中占用5个字节(每个字符一个字节),而二进制形式输出,则在磁盘上只占4个字节(VS2013测试)。

在这里插入图片描述

文件读取结束的判定

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

fgetc 判断是否为EOF .
fgets 判断返回值是否为NULL .

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

fread判断返回值是否小于实际要读的个数。

feofferror

feof 函数描述:

在这里插入图片描述

如果遇到文件末尾结束,返回非0,否则返回0

ferror 函数描述:

在这里插入图片描述

如果遇到读取错误结束,返回非0,否则返回0

// demo
enum { SIZE = 5 };
int main(void)
{double a[SIZE] = {1.,2.,3.,4.,5.};FILE *fp = fopen("test.bin", "wb"); // 必须用二进制模式fwrite(a, sizeof *a, SIZE, fp); // 写 double 的数组fclose(fp);double b[SIZE];fp = fopen("test.bin","rb");size_t ret_code = fread(b, sizeof *b, SIZE, fp); // 读 double 的数组if(ret_code == SIZE) // 本次读取成功{puts("Array read successfully, contents: ");for(int n = 0; n < SIZE; ++n) printf("%f ", b[n]);putchar('\n');} else { // error handlingif (feof(fp))printf("Error reading test.bin: unexpected end of file\n");else if (ferror(fp)) {perror("Error reading test.bin");}}fclose(fp);
}

文件缓冲区

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

在这里插入图片描述

// demo#include <stdio.h>
#include <windows.h>
//VS2013 WIN10环境测试
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;
}

所以在进行完文件操作后需要将文件关闭。不然将会导致数据的丢失。

总结

文件的操作相对来说有点繁琐,并且需要谨慎选择库函数。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

python抢票开发——设备预约助手实现

女朋友是药学院的&#xff0c;做实验时需要在特定的网站上进行设备预约&#xff0c;由于预约人数过多&#xff0c;从而导致从浏览器登录不进去或者登录进去预约失败等情况&#xff0c;所以我用python帮她写了一个抢位助手&#xff0c;让程序自动去进行位置预定&#xff0c;实测…

春节Python抢票神器,支持候补抢票真的无敌了

想要回家的小伙伴们,大概经历了一波抢票大战。 一年一度春运着实让人难熬 这次顺便把一个Python抢票工具,送到了GitHub趋势榜第一。 项目名很干脆,就是12306,来自名叫文贤平的程序员。 这很可能是全GitHub最德高望重的购票小助手了,功能一直在更新,且现已支持Python …

Java IO流动(实战操作)

目录 1 IO流原理2 IO流的分类3 输入、输出流代码示例4 小结5 文件在前后台之间传递 在Java中&#xff0c;IO流是一种用于处理输入和输出操作的机制。它提供了一种统一的方式来读取和写入数据&#xff0c;平日开发中在文件读写&#xff0c;网络通信&#xff0c;特定场景的数据库…

老话题,火车票抢票助手,简化版 (漏洞已经失效^_^)

用了“二杠”兄弟的工具测试了抢票&#xff0c;先举个大拇指。牛&#xff01;可是我实在看不惯他画的界面&#xff0c;而且需要认证和访问他服务器上的wcf服务。看到许多园友都号称“破解”了。我也请出"Reflector"神器&#xff0c;尝试了下。发现把源exe文件作为app…

python模拟火车订票系统_如何用python编写火车抢票助手

前几天跟朋友说打算写一个抢票助手&#xff0c;最后由于某些原因念头打消了。 可就在昨天晚上&#xff0c;才隐约记起一年前的自己曾经说过&#xff1a;一年后我一定要写一个12306的抢票助手&#xff01;瞬间激情澎湃&#xff0c;甚至已经是快临近凌晨时便开始动工&#xff0c;…

无涯教程-Python机器学习 - Based on human supervision函数

Python机器学习 中的 Based on human s - 无涯教程网无涯教程网提供https://www.learnfk.com/python-machine-learning/machine-learning-with-python-based-on-human-supervision.html

Yolo系列-yolov3

YOLO-V3 这张图讲道理真的过分了&#xff01;&#xff01;&#xff01;我不是针对谁&#xff0c;在座的各位都是 终于到V3了&#xff0c;最大的改进就是网络结构&#xff0c;使其更适合小目标检测特征做的更细致&#xff0c;融入多持续特征图信息来预测不同规格物体 先验框更丰…

java 分布式游戏服务器框架,集群游戏服务器框架,游戏服务器网关框架 ioGame 网络游戏服务器框架

网络游戏框架简介 ioGame 是一个由 java 语言编写的网络游戏服务器框架。支持 websocket、tcp &#xff0c;适用于全球同服、回合制游戏、策略游戏、即时战斗等游戏服务器的开发。具有高性能、稳定、易用易扩展、超好编程体验等特点。可做为 H5、手游、端游的 java 游戏服务器…

游戏服务器架构通识

前言 这节讲座里&#xff0c;我们将从游戏服务器发展的简单历程出发&#xff0c;鸟瞰一下目前大多数的游戏服务器架构。 这里尽可能的避免陷入细节的技术问题&#xff0c;而是从技术进化的结果状态&#xff0c;反推原始问题是什么。希望能通过这个过程&#xff0c;解释清楚游戏…

游戏服务器架构设计整理

文章目录 前言一、单进程多线程的服务器设计模式&#xff0c;只有一个进程&#xff0c;但一个进程包好多个线程二、多进程单线程的服务器设计模式&#xff0c;多个进程&#xff0c;每个进程只有一个线程1.早期的MMORPG服务器结构2.中期-用户分离集群式3.中后期数据分离集群式4.…

游戏服务器被攻击了怎么办?

随着互联网的发展&#xff0c;网民数量激增&#xff0c;电子游戏的普及&#xff0c;庞大的玩家数量必然推动游戏市场发展。游戏受到攻击是游戏开发者的痛点&#xff0c;DDOS攻击是流量攻击的一个总称&#xff0c;还包括SYN Flood、ACK Flood、UDP Flood、TCP Flood、ICMP Flood…

经典游戏服务器端架构

文章目录 一、 讨论的背景二、 游戏服务器架构的要素三、核心的三个架构四、 游戏服务器模型的进化历程五、分服模型1.模型描述2.调度架构1.单进程游戏服务器2.多进程游戏服务器 3.内存架构1.动态内存2.预分配内存 4.进程间通讯手段1.Socket通讯2.消息队列3.远程调用 5.容灾和扩…

哪家的云游戏服务器好?如何选择云游戏服务器?

现如今&#xff0c;不少行业领域都对云服务器有不少的需求&#xff0c;尤其是游戏行业&#xff0c;需要专门的云游戏服务器。目前市场上的云游戏服务器有很多种类型&#xff0c;那么&#xff0c;哪家的云游戏服务器好呢&#xff1f;如何选择云游戏服务器&#xff1f;下面就跟着…

游戏开发商如何租用合适稳定的游戏服务器?

随着互联网的快速发展&#xff0c;网络游戏的发展令人目不暇接。有些游戏开发商在开发游戏时&#xff0c;对游戏服务器的要求非常高&#xff0c;毕竟一款游戏最重要的是流畅度。如果大量用户在玩游戏&#xff0c;而游戏直接因为服务器的宕机而崩溃&#xff0c;这种体验可能会直…

游戏服务器开发

1 2-课程概述 https://www.bilibili.com/video/BV1Ks41177oi?fromsearch&seid5543458349378694564nodejs lua STL IO 语言方面 精简 不像Python 无统一 游戏服务器 工作量 不是 网络连接 是 逻辑的 实现 定义 一个 struct 有两个成员 指针 和 值 …

从零开始搭建游戏服务器 第一节 创建一个简单的服务器架构

目录 引言技术选型正文创建基础架构IDEA创建项目添加Netty监听端口编写客户端进行测试 总结 引言 由于现在java web太卷了&#xff0c;所以各位同行可以考虑换一个赛道&#xff0c;做游戏还是很开心的。 本篇教程给新人用于学习游戏服务器的基本知识&#xff0c;给新人们一些…

鹅厂公开课:游戏服务器,了解一下?

讲师简介&#xff1a;张正&#xff0c;腾讯互娱北极光工作室群专家工程师&#xff0c;拥有12年游戏后台开发经验&#xff0c;主导和参与了《天涯明月刀》、《轩辕传奇》等自研大型MMORPG项目的后台开发&#xff0c;现担任《天涯明月刀》项目后台技术总监&#xff0c;北极光后台…

游戏服务器的那些事儿

游戏程序开发有两个大方向&#xff0c;包括前端和后端。其中&#xff0c;前端是指客户端方面&#xff0c;包括PC、手机和平板上面的可视化图形技术。后端则偏向于服务器&#xff0c;即用户不可见的部分。本文将通过游戏服务器的起源、功能特点、分类和发展历史&#xff0c;以及…

〔017〕Stable Diffusion 之 常用模型推荐 篇

✨ 目录 &#x1f388; 模型网站&#x1f388; 仿真系列&#x1f388; 国风系列&#x1f388; 卡通动漫系列&#x1f388; 3D系列&#x1f388; 一些好用的lora模型 &#x1f388; 模型网站 由于现在大模型超级多&#xff0c;导致每种画风的模型太多&#xff0c;那么如何选择最…

通达信形态匹配选股,不会编写指标公式也可以形态选股

编写指标公式匹配技术形态难度比较高&#xff0c;公式也很复杂&#xff0c;新手往往难以掌握&#xff0c;即使是老手也常常感到困难。之前编写了N字形态、W底&#xff08;双底&#xff09;、头肩底&#xff0c;虽然成功完成&#xff0c;但工作量巨大&#xff0c;公式理解起来也…