c语言文件操作(下)

news2024/9/20 1:05:23

目录

  • 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.coloradmin.cn/o/1546752.html

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

相关文章

Python篇之网络编程,实现简单的服务端和客户端的内容传输

本小节内容&#xff1a;实现简单的信息交流 文章目录 一、 Socket介绍二、客户端与服务端三、在python中实现网络通信1. 服务端2. 客户端3. 连接测试 一、 Socket介绍 socket (简称 套接字) 模块是其内置的标准库之一&#xff0c;它实现了BSD sockets API&#xff0c;允许开发…

(分享)一个图片添加水印的小demo的页面,可自定义样式

有时候想给某张图片添加一个自己的水印&#xff0c;但是又懒的下载相应软件&#xff0c;用js canvas制作一个静态页面&#xff0c;对于单张图片添加自定义文字水印&#xff0c;大小 间距&#xff0c;角度可调。 页面如下&#xff1a; 选择图片&#xff0c;设置相应参数&#x…

深度学习模型部署(十二)CUDA编程-绪

CUDA 运行时 API 与 CUDA 驱动 API 速度没有差别&#xff0c;实际中使用运行时 API 较多&#xff0c;运行时 API 是在驱动 API 上的一层封装。​ CUDA 是什么&#xff1f;​ CUDA(Compute Unified Device Architecture) 是 nvidia 推出的一个通用并行技术架构&#xff0c;用它…

【LLM】大模型推理加速 KV-Cache

目录 模型推理过程KV Cache原理KV Cache的存储 模型推理过程 在了解KVCache之前&#xff0c;我们需要知道Transformer类大模型的推理过程。 对于LLM进行一次前向传播也就是生成一个token的过程可以被分解成以下步骤&#xff1a; 文本 T i n p u t T_{input} Tinput​经过Toke…

数据结构与算法分析引论1

1.解决问题的算法有很多&#xff0c;但是在输入不同的情况下&#xff0c;不同算法之间的差异也很大&#xff0c;我们总是追求一个更快、更有效的方法。比如说普通的依次查找和二分查找&#xff0c;两者的差异就很大。我们使用大O表示法来表示算法的速度。依次查找就是O(n)&…

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48)

MATLAB 自定义生成平面点云(可指定方向,添加噪声)(48) 一、算法介绍二、算法步骤三、算法实现1.代码2.效果一、算法介绍 通过这里的平面生成方法,可以生成模拟平面的点云数据,并可以人为设置平面方向,平面大小,并添加噪声来探索不同类型的平面数据。这种方法可以用于…

UDS诊断中的NRC

我总结了一张表格&#xff1a;详细解释了NRC的分布情况和NRC的触发条件 1&#xff1a;基本概念 NRC 全称Negative Response Code(否定响应代码)&#xff0c;是指示uds诊断中的&#xff0c;指示否定响应的原因 例如&#xff1a;0x22 服务 request 报文 0x618 03 22 F1 34 0…

电脑物理磁盘空间不足?试试这5种清理和优化方法!

随着我们使用电脑的时间越来越长&#xff0c;物理磁盘空间可能会逐渐变得捉襟见肘。当你的电脑提示磁盘空间不足时&#xff0c;不要慌张&#xff0c;这里有五种方法可以帮助你清理和优化电脑&#xff0c;释放宝贵的存储空间。 1. 卸载不常用的程序和游戏 许多用户在安装软件和…

机器学习基础——模型评估与选择(部分)

目录 一、前言&#xff1a;误差与拟合 &#xff08;一&#xff09;经验误差 &#xff08;二&#xff09;过拟合、欠拟合 二、评估方法 &#xff08;一&#xff09;评估总体的思路 &#xff08;二&#xff09;如何划分训练集和测试集 1.留出法 2.k折交叉验证 3.自助法 …

程序员35岁真的就是危机吗?

前言 35岁被认为是程序员职业生涯的分水岭&#xff0c;许多程序员开始担忧自己的职业发展是否会受到年龄的限制。有人担心随着年龄的增长&#xff0c;技术更新换代的速度会使得资深程序员难以跟上&#xff1b;而另一些人则认为&#xff0c;丰富的经验和深厚的技术积累是年轻程…

knife4j/swagger救援第一现场

1、前方来报&#xff0c;测试环境springboot项目无法启动&#xff0c;现场如下&#xff1a; Error starting ApplicationContext. To display the auto-configuration report re-run your application with debug enabled. [ERROR] 2024-03-20 12:54:42,718 --main-- [org.spr…

一键跳过开屏广告,这下舒服了

现在的app开屏广告越来越过分了&#xff0c;不小心摇一摇翻转就点开广告了。 今天分享个强大的自动跳过广告https://github.com/gkd-kit/gkd&#xff0c;李跳跳替代品&#xff0c;下载地址在公众号后台对话框回复 广告 玩转互联网达人 苏生不惑备用号&#xff0c;分享各种黑科…

【Godot4自学手册】第二十九节使用Shader来实现敌人受伤的闪白效果

在Godot 4中&#xff0c;Shader是用来为材质提供自定义渲染效果的程序。材质可以应用于MeshInstance、CanvasItem和ParticleEmitter等节点。Shader可以影响顶点的变换、片段&#xff08;像素&#xff09;的颜色&#xff0c;以及光照与物体的交互。 在Godot中&#xff0c;Shader…

HTML基础:8个常见表单元素的详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端程序媛。 后台回复“前端工具”可免费获取开发工具&#xff0c;持续更新。 今天来说说 HTML 表单。它是用于收集用户输入信息的元素集合。例如文本框、单选按钮、复选框、下拉列表等。 用户经常填写的表…

海外媒体软文发稿:谷歌关键词优化细分人群成功案例,突破海外市场!

海外媒体软文发稿&#xff1a;谷歌关键词优化细分人群成功案例&#xff0c;突破海外市场&#xff01; 引言 在全球化的时代&#xff0c;海外市场对于企业的发展至关重要。而在海外市场中&#xff0c;互联网媒体的作用不可忽视。本篇教程将介绍如何通过谷歌关键词优化细分人群…

西井科技与安通控股签署战略合作协议 共创大物流全新生态

2024年3月21日&#xff0c;西井科技与安通控股在“上海硅巷”新象限空间正式签署战略合作框架协议。双方基于此前在集装箱物流的成功实践与资源优势&#xff0c;积极拓展在AI数字化产品、新能源自动驾驶解决方案和多场景应用&#xff0c;以及绿色物流链等领域的深度探索、强强联…

2024.3.23

1、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是否…

鸿蒙应用开发-录音并使用WebSocket实现实时语音识别

功能介绍&#xff1a; 录音并实时获取RAW的音频格式数据&#xff0c;利用WebSocket上传数据到服务器&#xff0c;并实时获取语音识别结果&#xff0c;参考文档使用AudioCapturer开发音频录制功能(ArkTS)&#xff0c;更详细接口信息请查看接口文档&#xff1a;AudioCapturer8和…

如何推进制造业数字化转型?《制造业数字化转型白皮书》分享给你

分享一份《制造业数字化转型白皮书》给你&#xff0c;希望对你有所帮助&#xff01; 内容较长&#xff0c;防止后续找不到&#xff0c;建议先收藏&#xff01; 变局&#xff1a;数字经济浪潮“不期而至” 中国制造何去何从&#xff1f; VUCA&#xff08;不稳定 Volatile、不确…

超详细SpringMVC源码剖析

整体流程图 1.自定义视图(63~66) 视图解析过程 1.先到DispatcherServlet中央控制器, 根据视图解析的 优先级 执行对应的 视图解析器 Nullable protected View resolveViewName(String viewName, Nullable Map<String, Object> model,Locale locale, HttpServletReque…