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,初始化会把里面全变成\0
	FILE* pFile = fopen("myfile.txt", "w+");
	for (n = 'A'; n <= 'Z'; n++)
		fputc(n, pFile);
	rewind(pFile); //rewind是让文件指针的位置回到文件的起始位置

	position = ftell(pFile);//ftell是返回文件指针相对于起始位置的偏移量,返回类型是long
	printf("%d\n", position);
	fread(buffer, 1, 26, pFile);
	//(字符串的地址,类型大小,读取个数,流的地址)
	fclose(pFile);

	buffer[26] = '\0';//fread 并不会添加\0
	printf(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 handling
		 if (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.mfbz.cn/a/490690.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【STL学习】(2)string的模拟实现

前言 本文将模拟实现string的一些常见功能&#xff0c;目的在于加深理解string与回顾类与对象的相关知识。 一、前置知识 string是表示可变长的字符序列的类string的底层是使用动态顺序表存储的string对象不以’\0’字符为终止算长度&#xff0c;而是以size有效字符的个数算长…

7.2024

小明发现了一个奇妙的数字。它的平方和立方正好把 0 ~ 9 的 10 个数字每个用且只用了一次。你能猜出这个数字是多少吗&#xff1f; 代码&#xff1a; import java.util.HashSet; import java.util.Set;public class 第七题 {public static void main(String[] args) {int i1;…

Docker数据卷与网络模式

华子目录 数据卷注意数据卷操作查看镜像&#xff0c;容器&#xff0c;数据卷所占空间 Docker的网络模式查看指定容器的网络模式bridge模式none模式host模式container模式 数据卷 数据卷是一个可供一个或多个容器使用的特殊目录&#xff0c;它绕过UFS&#xff0c;可以提供很多有…

LangChain-Chatchat

文章目录 关于 LangChain-Chatchat特性说明实现原理文档处理流程技术路线图&#xff08;截止0.2.10&#xff09; 使用 关于 LangChain-Chatchat Langchain-Chatchat&#xff08;原Langchain-ChatGLM&#xff09;基于 Langchain 与 ChatGLM 等语言模型的本地知识库问答。 gith…

阿赵UE学习笔记——21、武器插槽

阿赵UE学习笔记目录 大家好&#xff0c;我是阿赵。   继续学习虚幻引擎的使用&#xff0c;这次来看看骨骼插槽的用法。 一、准备资源 这次的目的很简单&#xff0c;就是给之前做了角色蓝图的钢铁侠手上加一把枪。   所以先要找到枪的资源。在虚幻商城里面搜索weapon&#…

Transformer 模型中增加一个 Token 对计算量的影响

Transformer 模型中增加一个 Token 对计算量的影响 Transformer 模型中增加一个 Token 对计算量的影响1. Transformer 模型简介2. Token 对计算量的影响3. 增加一个 Token 的计算量估算4. 应对策略5. 结论 Transformer 模型中增加一个 Token 对计算量的影响 Transformer 模型作…

【二】TensorFlow神经网络模型构建之卷积函数

卷积函数是构建神经网络的重要支架&#xff0c;是在一批图像上扫描的二维过滤器。 tf.nn.convolution(input,filter,padding,stridesNone,dilation_rateNone,nameNone,data_formatNone)该函数计算N维卷积的和。tf.nn.conv2d(input,filter,padding,strides,use_cudnn_on_gpuNon…

前端学习<二>CSS基础——02-CSS属性:背景属性

background 的常见背景属性 css2.1 中&#xff0c;常见的背景属性有以下几种&#xff1a;&#xff08;经常用到&#xff0c;要记住&#xff09; background-color:#ff99ff; 设置元素的背景颜色。 background-image:url(images/2.gif); 将图像设置为背景。 background-repeat…

201812 CSP认证 | CIDR合并

CIDR合并 难是真的不难但是也写了我几个小时服了 这道题在有计网的基础上就很好理解了&#xff0c;没有在格式上有任何刁难你的。这里不讲背景了 官网提交结果以及满分代码如下&#xff1a; #include<bits/stdc.h> using namespace std; typedef long long ll; typedef…

鸿蒙开发实例:【demo-搜索历史记录】

图片演示效果&#xff1a; 鸿蒙OS开发更多内容↓点击HarmonyOS与OpenHarmony技术鸿蒙技术文档开发知识更新库gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md在这。或mau123789学习&#xff0c;是v喔 代码演示&#xff1a; // 注&#xff1a;当前代码基于宽度为…

【Leetcode】top 100 二叉树

基础知识补充 完全二叉树&#xff1a;顺序存储&#xff08;数组&#xff09; 非根节点的父节点序号floor((i-1)/2) 序号i的左孩子节点序号2*i1 右孩子节点序号2*i2 一般二叉树&#xff1a;链式存储 结构&#xff1a;left指针指向左子节点&#xff0c;right指针指向右子节点&am…

vue3+threejs新手从零开发卡牌游戏(十五):创建对方场地和对方卡组

首先创建对方场地&#xff0c;game/site/p2.vue和p1.vue代码一样&#xff0c;注意把里面的命名“己方”修改成“对方”&#xff0c;game/site/index.vue代码如下&#xff0c;用rotateZ翻转一下即可得到镜像的对方场地&#xff1a; // 添加战域plane const addSitePlane () >…

Leetcode 76 最小覆盖子串 java版

官网链接&#xff1a; . - 力扣&#xff08;LeetCode&#xff09; 1. 问题&#xff1a; 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串&#xff0c;则返回空字符串 "" 。 注意&#xff1a; 对于 …

【项目管理——时间管理】【自用笔记】

1 项目时间管理&#xff08;进度管理&#xff09;概述 过程&#xff1a;&#xff08;2—6&#xff09;为规划过程组&#xff0c;7为监控过程组 题目定义&#xff1a;项目时间管理又称为进度管理&#xff0c;是指确保项目按时完成所需的过程。目标&#xff1a;时间管理的主要目标…

FlyControls 是 THREE.js 中用于实现飞行控制的类,它用于控制摄像机在三维空间中的飞行。

demo演示地址 FlyControls 是 THREE.js 中用于实现飞行控制的类&#xff0c;它用于控制摄像机在三维空间中的飞行。 入参&#xff1a; object&#xff1a;摄像机对象&#xff0c;即要控制的摄像机。domElement&#xff1a;用于接收用户输入事件的 HTML 元素&#xff0c;通常…

蓝桥杯刷题8

1. 世纪末的星期 import java.util.Calendar; public class Main {public static void main(String[] args) {Calendar calendar Calendar.getInstance();for(int year 1999;year<100000;year100){calendar.set(Calendar.YEAR,year);calendar.set(Calendar.MONTH,11);cale…

力扣hot100:207. 课程表

这是一道拓扑排序问题&#xff0c;也可以使用DFS判断图中是否存在环。详情请见&#xff1a;官方的BFS算法请忽略&#xff0c;BFS将问题的实际意义给模糊了&#xff0c;不如用普通拓扑排序思想。 数据结构&#xff1a;图的拓扑排序与关键路径 拓扑排序&#xff1a; class Sol…

手撕算法-三数之和

描述 分析 排序双指针直接看代码。 代码 public static List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums);List<List<Integer>> res new ArrayList<>();for(int k 0; k < nums.length - 2; k){if(nums[k] > 0) break; …

通讯录管理系统实现(C++版本)

1.菜单栏的设置 &#xff08;1&#xff09;我么自定义了一个showmenu函数&#xff0c;用来打印输出我们的菜单栏&#xff1b; &#xff08;2&#xff09;菜单栏里面设置一些我们的通讯录里面需要用到的功能&#xff0c;例如增加联系人&#xff0c;删除联系人等等 2.退出功能…

【Python系列】Python 中 YAML 文件与字典合并的实用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…
最新文章