c语言文件操作(下)

目录

  • 1.文件的随机读写
    • 1.1 fseek
    • 1.2 ftell
    • 1.3 rewind
  • 2. 文件结束的判定
    • 2.1 文本文件读取结束的判断
    • 2.2 二进制文件读取结束的判断
  • 3. 文件缓冲区

1.文件的随机读写

1.1 fseek

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

  • 函数原型:
int fseek (FILE * stream, long offset, int origin);
  • stream :一个指向文件流的指针。

  • offset :距离文件参考位置的偏移量。

  • origin :文件指针的参考位置。

    • 文件的参考位置有如下三种 :
      在这里插入图片描述
    • SEEK_SET :文件的开头。
    • SEEK_CUR :文件指针的当前位置。
    • SEEK_END :文件的结束位置 。

例子

#include <stdio.h>int main()
{FILE* pFile = fopen("example.txt", "wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);//9是距离文件起始的偏移量,表示将文件指针移到距离文件开头偏移量为9的地方,即字符串中n的位置,则下一次执行的文件操作将从n的位置开始//fseek有三个位置常量//SEEK_SET 文件起始位置 偏移量为0//SEEK_CUR 文件指针的当前位置//SEEK_END 文件结束位置 使用时偏移量可以是负数,表示向左偏移fputs(" sam", pFile);fclose(pFile);return 0;
}
  • 输出结果 :
    在这里插入图片描述
  • 返回值 : 如果成功,函数返回0,失败则返回非0值。

1.2 ftell

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

  • 函数原型 :
long ftell (FILE * stream);
  • stream : 一个指向文件流的指针。
  • 返回值 :返回文件指针相对于起始位置的偏移量。

1.3 rewind

让⽂件指针的位置回到⽂件的起始位置。

  • 函数原型 :
void rewind (FILE * stream);
  • stream : 一个指向文件流的指针。

例子ftellrewind):

#include <stdio.h>int main()
{int position = 9;int n = 0;;char buffer[27];//不初始化字符串里就没有\0,初始化会把里面全变成\0FILE* pFile = fopen("myfile.txt", "w+");for (n = 'A'; n <= 'Z'; n++)fputc(n, pFile);rewind(pFile); //rewind是让文件指针的位置回到文件的起始位置position = ftell(pFile);//ftell是返回文件指针相对于起始位置的偏移量,返回类型是longprintf("%d\n", position);fread(buffer, 1, 26, pFile);//(字符串的地址,类型大小,读取个数,流的地址)fclose(pFile);buffer[26] = '\0';//fread 并不会添加\0printf(buffer);return 0;
}
  • 输出结果(文件) :
    在这里插入图片描述
  • 输出结果(屏幕):
    在这里插入图片描述

2. 文件结束的判定

2.1 文本文件读取结束的判断

⽂本⽂件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets )。

例如 :

  • fgetc 读取结束返回EOF,判断返回是否是EOF。
  • fgets 读取结束返回NULL,判断返回是否是NULL。

例子

#include <stdio.h>
#include <stdlib.h>int main()
{int c; // 注意:int,⾮char,要求处理EOF FILE* fp = fopen("test.txt", "r");if(fp == NULL) {perror("File opening failed");return EXIT_FAILURE;}//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环 { putchar(c);}//判断是什么原因结束的 if (ferror(fp))puts("I/O error when reading");else if (feof(fp))puts("End of file reached successfully");fclose(fp);
}

2.2 二进制文件读取结束的判断

⼆进制⽂件的读取结束判断,判断返回值是否⼩于实际要读的个数。

例如 :

  • fread 读取结束返回成功读取的个数,判断返回值是否⼩于实际要读的个数。

例子

#include <stdio.h>enum { SIZE = 5 };
int main()
{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);
}

3. 文件缓冲区

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语言在操作文件时,需要刷新缓冲区或者关闭文件(指fclose),如果不做这样的操作,可能导致读写文件的问题,所以在台式电脑断电的时候可能会丢失数据(没来得及将缓冲区的数据输入文件中)。

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

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

相关文章

Springboot+vue的企业质量管理系统(有报告)。Javaee项目,springboot vue前后端分离项目。

演示视频&#xff1a; Springbootvue的企业质量管理系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09…

黑马头条day5总结

1、surefire-reports for the individual test results. 借鉴&#xff1a;【已解决】surefire-reports for the individual test results.-CSDN博客 Please refer to D:\javashizhan01\heima-leadnews\heima-leadnews-service\heima-leadnews-article\target\surefire-report…

HTML(二)---【常见的标签使用】

零.前言 本文只介绍常见的标签使用&#xff0c;其中使用的一些HTML专业术语可以在作者的第一篇文章&#xff1a; HTML&#xff08;一&#xff09;---【基础】-CSDN博客中找到。 一.<b>粗体、<i>或<em>斜体 1.定义 粗体、斜体的实现可以在CSS中实现&…

【半结构化访谈法】

文章目录 什么是半结构化访谈法&#xff1f;如何进行半结构化访谈&#xff1f;1. 确定研究目的和主题2. 制定访谈指南3. 进行访谈4. 记录和分析数据5. 报告结果 半结构化访谈法的优缺点优点&#xff1a;缺点&#xff1a; 什么是半结构化访谈法&#xff1f; 半结构化访谈法是一…

Windows 和 Linux 的免费媒体播放器 - SMPlayer

Windows 和 Linux 的免费媒体播放器 - SMPlayer 1. A quick look at SMPlayer2. Downloads2.1. Packages for Ubuntu References https://www.smplayer.info/ 1. A quick look at SMPlayer SMPlayer is a free media player for Windows and Linux with built-in codecs that…

【MySQL】事务日志

事务的隔离性由锁机制实现&#xff0c;事务的原子性、一致性和持久性由redo日志和undo日志实现。 一、redo日志 1.1、为什么需要redo日志 一方面&#xff0c;由于数据从内存写回磁盘需要一定的时间&#xff0c;假如在事务提交后&#xff0c;还没有写回磁盘&#xff0c;数据库…

优雅地处理前端数据转换:自定义封装 translateDict 函数

在前端开发中&#xff0c;我们经常需要处理数据的转换。有时候&#xff0c;我们需要将某种格式的数据转换为另一种格式&#xff0c;这可能涉及到字符串、数组等不同数据类型的转换。在这篇博客中&#xff0c;我们将介绍一个名为 translateDict 的函数&#xff0c;它可以帮助我们…

Rancher(v2.6.3)——Rancher部署Nginx(单机版)

Rancher部署Nginx详细说明文档&#xff1a;https://gitee.com/WilliamWangmy/snail-knowledge/blob/master/Rancher/Rancher%E4%BD%BF%E7%94%A8%E6%96%87%E6%A1%A3.md#5rancher%E9%83%A8%E7%BD%B2nacos ps&#xff1a;如果觉得作者写的还行&#xff0c;能够满足您的需求&#x…

LeetCode225:用队列实现栈

题目描述 请你仅使用两个队列实现一个后入先出&#xff08;LIFO&#xff09;的栈&#xff0c;并支持普通栈的全部四种操作&#xff08;push、top、pop 和 empty&#xff09;。 实现 MyStack 类&#xff1a; void push(int x) 将元素 x 压入栈顶。 int pop() 移除并返回栈顶元…

web前端面试题---->HTML、CSS

一.居中方法 block元素如何居中 margin&#xff1a;0 auto&#xff1b;position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%);flex布局&#xff1a; 对父元素操作 &#xff1a; justify-content:center; al…

商城小程序项目实现监控的可观测性最佳实践

前言 微信小程序是一种轻量级的应用程序&#xff0c;用户可以在微信内直接使用&#xff0c;无需下载安装。它具有独立的开发框架和生态系统&#xff0c;支持丰富的功能和交互&#xff0c;包括社交、购物、服务等。 观测云对微信小程序的监控能够实时收集性能指标、错误日志和…

深入理解 C++ 中的 IO 流【iostream篇】

C 中的输入输出流&#xff08;iostream&#xff09;是非常重要的一部分&#xff0c;它们提供了与用户交互以及与文件系统进行数据交换的功能。本文将深入探讨 C 中的 cin 和 cout&#xff0c;介绍它们的使用方法、缓冲区以及常用的成员函数等相关知识。 1. cin 和 cout 的基本…

[蓝桥杯 2019 省 B] 特别数的和

题目描述 小明对数位中含有 22、00、11、99 的数字很感兴趣&#xff08;不包括前导 00&#xff09;&#xff0c;在 11 到 4040 中这样的数包括 11、22、99、1010 至 3232、3939 和 4040&#xff0c;共 2828 个&#xff0c;他们的和是 574574。 请问&#xff0c;在 11 到 &…

分布式系统CAP理论

1、什么是CAP理论 C是Consistency(强一致性)、A是Availability(可用性)、P是Partition Tolerance(分区容错性)&#xff0c;一个分布式系统不可能同时很好的满足—致性、可用性和分区容错性这三个需求&#xff0c;不能同时成立&#xff0c;最多只能同时满足其中的两项&#xff…

MPIRUN 31280 segmentation fault (core dumped)

用mpirun运行多节点nccl时有时候出现hang死&#xff0c;而且是指定了mpi_host的情况 nccl正常&#xff0c;各节点通信正常&#xff0c;但是一跑mpirun就卡死&#xff0c;core dump。 提前退出&#xff1a; [worker0:38156] *** Process received signal *** [worker0:38156] …

Linux系统运维命令:找出某个分区或者路径下 占用磁盘空间最多的文件和目录

目录 一、需求 二、解决方法 1、解决思路 2、组合命令 3、du命令 三、实例演示和命令解释 1、实例演示 &#xff08;1&#xff09;查看当前路径下文件和目录 &#xff08;2&#xff09;命令效果展示 2、命令解释 &#xff08;1&#xff09;. du -cks &#xff08;2…

rt-thread开发之sccb通讯协议记录(用于ov7670)

头文件 /** Copyright (c) 2024-2024&#xff0c;shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2024-3-26 shchl first version*/#ifndef F4_OS_SCCB_H #define F4_OS_SCCB_H#include "board.h"#define …

小白学视觉 | 图像上的 OpenCV 算术运算

本文来源公众号“小白学视觉”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;图像上的 OpenCV 算术运算 1 OpenCV 简介 图像可以进行算术运算&#xff0c;例如加法、减法和按位运算&#xff08;AND、OR、NOT、XOR&#xff09;。…

电商系列之仓储发货

疫情3年&#xff0c;大多数人都将购买需求转移到了线上。同时由于暴涨的订单数量、还在恢复中的物流运输等因素&#xff0c;导致用户的收货时间缓慢甚至是发货时间、收货时间延后。那么笔者就从订单的仓库作业流程入手&#xff0c;分析了用户订单发货延后的原因。 受到最近疫情…

简历工具推荐

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 以最简单的方式来写好简历&#xff0c;只需专注内容本身而无需关注排版。这样的效果才是我们想要的&#xff0c;这里推荐使用入职啦简历&#xff0c;这个工具最大的…