Linux C\C++编程-文件位置指针与读写文件数据块

【图书推荐】《Linux C与C++一线开发实践(第2版)》_linux c与c++一线开发实践pdf-CSDN博客

《Linux C与C++一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书

LinuxC\C++编程技术_夏天又到了的博客-CSDN博客

4.9.7  文件位置指针

先复习一下C语言中的文件指针定位函数fseek(),其声明如下:

int fseek(FILE *fp, LONG offset, int origin);

其中,fp是文件指针;offset是相对于origin规定的偏移位置量;origin是指针移动的起始位置,可设置为以下3种情况:

  • SEEK_SET:文件开始位置。
  • SEEK_CUR:文件当前位置。
  • SEEK_END:文件结束位置。

当offset是向文件末尾方向偏移的时候,无论偏移量是否超出文件末尾,fseek都返回0,当偏移量没有超出文件末尾的时候,文件指针指向正常的偏移地址;当偏移量超出文件末尾的时候,文件指针指向文件末尾,并不会返回表示偏移出错的-1值。当offset向文件头方向偏移的时候,如果偏移量没有超出文件头,就是正常偏移,文件指针指向正确的偏移地址,fseek返回值为0;当偏移量超出文件头时,fseek返回-1值,文件指针不变,还是处于原来的地址。

在C++中,istream和ostream也提供了用于重新定位文件位置指针的成员函数seekg和seekp:seekg用于设置输入文件流的文件流指针位置,而seekp用于设置输出文件流的文件流指针位置。它们的声明如下:

ostream& seekp( streampos pos );

ostream& seekp( streamoff off, ios::seek_dir dir );

istream& seekg( streampos pos );

istream& seekg( streamoff off, ios::seek_dir dir );

其中,pos表示新的文件流指针位置值;off表示需要偏移的值;dir表示搜索的起始位置,该参数的类型是一个枚举:

enum seek_dir {beg, cur, end};

每个枚举常量的含义如下:

  • ios::beg:文件流的起始位置(默认值,从流的开头开始定位)。
  • ios::cur:文件流的当前位置。
  • ios::end:文件流的结束位置。

文件位置指针是一个整数值,指定了从文件的起始位置到指针所在位置的字节数。下面是关于定位文件位置指针的代码片段。

// 定位到 fileObject 的第 n 个字节(假设是 ios::beg)
fileObject.seekg( n );

// 把文件的读指针从 fileObject 当前位置向后移 n 个字节
fileObject.seekg( n, ios::cur );

// 把文件的读指针从 fileObject 末尾往回移 n 个字节
fileObject.seekg( n, ios::end );

// 定位到 fileObject 的末尾
fileObject.seekg( 0, ios::end );

下面的例子使用这些函数来获得一个二进制文件的大小。

【例4.14】获得二进制文件的大小

(1)打开Visual Studio Code,新建文本文件test.cpp,输入代码如下:

#include <iostream>
#include <fstream>
using namespace std;

    
const char * filename = "afile.dat"; // afile.dat在前面的例子中已经生成了
    
int main() {
	long l, m;
	ifstream file(filename, ios::in | ios::binary);
	l = file.tellg();
	file.seekg(0, ios::end);
	m = file.tellg();
	file.close();
	cout << "size of " << filename;
	cout << " is " << (m - l) << " bytes.\n";
	return 0;
}

(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,运行结果如下:

# g++ -o test test.cpp

# ./test

size of afile.dat is 7 bytes.

假设当前目录下有一个文件afile.dat,大小为7字节,上面的代码就可以判断出其大小。同时,我们可以在命令行下验证一下:

# ll afile.dat

-rw-r--r-- 1 root root 7 3月  15 21:49 afile.da

可以看出,果然是7字节。

4.9.9  读写文件数据块

C++的I/O中提供了write和read函数,分别从流中读取数据和向流写入数据。write函数是ostream的一个成员函数,被ofstream继承。而read是istream的一个成员函数,被ifstream继承。类fstream的对象同时拥有这两个函数。Write和read函数的原型是:

ostream& write ( char * buffer, streamsize size );

istream read ( char * buffer, streamsize size );

这里buffer是一块内存的地址,用来存储要写入或读出的数据。参数size是一个整数值,表示要从buffer中读出或写入的字符数。

下面两个小例子演示了这两个函数的使用。

【例4.16】复制文件

(1)打开Visual Studio Code,新建文本文件test.cpp,输入代码如下:

// 复制文件
#include <fstream>      // std::ifstream, std::ofstream

int main() {
	std::ifstream infile("myfile.txt", std::ifstream::binary);
	std::ofstream outfile("new.txt", std::ofstream::binary);

	// 获取文件大小
	infile.seekg(0, infile.end);
	long size = infile.tellg();
	infile.seekg(0);

 	// 为文件内容分配内存
	char* buffer = new char[size];

	// 读取infile的内容
	infile.read(buffer, size);

	// 向outfile写入内容
	outfile.write(buffer, size);

	// 释放动态分配的内存
	delete[] buffer;

	outfile.close();
	infile.close();
	return 0;
}

(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,运行结果如下:

# g++ test.cpp -o test
# ./test
# cat new.txt
Linux
boy

例4.17】读取文件到内存

(1)打开Visual Studio Code,新建文本文件test.cpp,输入代码如下:

// 将文件读入内存
#include <iostream>     // std::cout
#include <fstream>      // std::ifstream

int main() {

	std::ifstream is("myfile.txt", std::ifstream::binary);
	if (is) {
	    // 获取文件长度
		is.seekg(0, is.end);
		int length = is.tellg();
		is.seekg(0, is.beg);

		char * buffer = new char[length];

		std::cout << "Reading " << length << " characters... ";
		// 以块的形式读取数据
		is.read(buffer, length);

		if (is)
			std::cout << "all characters read successfully.";
		else
			std::cout << "error: only " << is.gcount() << " could be read";
		is.close();

		// 缓冲区包含整个文件内容
		delete[] buffer;
	}
}

(2)上传test.cpp到Linux,在终端下输入命令g++ -o test test.cpp,然后运行test,运行结果如下:

# g++ test.cpp -o test

# ./test

Reading 18 characters... all characters read successfully.

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

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

相关文章

一文简单回顾复习Java基础概念

还是和往常一样&#xff0c;我以提问的方式回顾复习&#xff0c;今天回顾下Java小白入门应该知道的一些基础知识 Java语言有哪些特点呢&#xff1f; Java语言的特点有&#xff1a; 面向对象&#xff0c;主要是封装、继承、多态&#xff1b;平台无关性&#xff0c;“一次编写…

Redis实战(黑马点评)——关于缓存(缓存更新策略、缓存穿透、缓存雪崩、缓存击穿、Redis工具)

redis实现查询缓存的业务逻辑 service层实现 Overridepublic Result queryById(Long id) {String key CACHE_SHOP_KEY id;// 现查询redis内有没有数据String shopJson (String) redisTemplate.opsForValue().get(key);if(StrUtil.isNotBlank(shopJson)){ // 如果redis的数…

神经网络|(四)概率论基础知识-古典概型

【1】引言 前序学习了线性回归的基础知识&#xff0c;了解到最小二乘法可以做线性回归分析&#xff0c;但为何最小二乘法如此准确&#xff0c;这需要从概率论的角度给出依据。 因此从本文起&#xff0c;需要花一段时间来回顾概率论的基础知识。 【2】古典概型 古典概型是我…

【C++】特殊类设计、单例模式与类型转换

目录 一、设计一个类不能被拷贝 &#xff08;一&#xff09;C98 &#xff08;二&#xff09;C11 二、设计一个类只能在堆上创建对象 &#xff08;一&#xff09;将构造函数私有化&#xff0c;对外提供接口 &#xff08;二&#xff09;将析构函数私有化 三、设计一个类只…

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…

16.好数python解法——2024年省赛蓝桥杯真题

问题描述 一个整数如果按从低位到高位的顺序,奇数位(个位、百位、万位…)上的数字是奇数,偶数位(十位、千位、十万位…)上的数字是偶数,我们就称之为“好数”。 给定一个正整数N,请计算从1到N一共有多少个好数。 输入格式 一个整数N。 输出格式 一个整数代表答案。 样例输入 1 …

2025年数学建模美赛 A题分析(2)楼梯使用频率数学模型

2025年数学建模美赛 A题分析&#xff08;1&#xff09;Testing Time: The Constant Wear On Stairs 2025年数学建模美赛 A题分析&#xff08;2&#xff09;楼梯磨损分析模型 2025年数学建模美赛 A题分析&#xff08;3&#xff09;楼梯使用方向偏好模型 2025年数学建模美赛 A题分…

Redis实战(黑马点评)——涉及session、redis存储验证码,双拦截器处理请求

项目整体介绍 数据库表介绍 基于session的短信验证码登录与注册 controller层 // 获取验证码PostMapping("code")public Result sendCode(RequestParam("phone") String phone, HttpSession session) {return userService.sendCode(phone, session);}// 获…

Brightness Controller-源码记录

Brightness Controller 亮度控制 一、概述二、ddcutil 与 xrandr1. ddcutil2. xrandr 三、部分代码解析1. icons2. ui3. utilinit.py 一、概述 项目&#xff1a;https://github.com/SunStorm2018/Brightness.git 原理&#xff1a;Brightness Controlle 是我在 Ubuntu 发现上调…

STM32简介

STM32简介 STM32是ST公司基于ARMCortex-M内核开发的32位微控制器 &#xff08;Microcontroller&#xff09; MCU微控制器、MPU微处理器、CPU中央处理器 1.应用领域 STM32常应用于嵌入式领域。 如智能车&#xff1a;循迹小车 读取光电传感器或者摄像头的数据&#xff0c;…

qt-C++笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别

qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphicsRectItem的区别 code review! 参考笔记 1.qt-C笔记之重写QGraphicsItem的paint方法(自定义QGraphicsItem) 文章目录 qt-C笔记之QLine、QRect、QPainterPath、和自定义QGraphicsPathItem、QGraphic…

浏览器IndexedDB占用大

使用鲁大师清理后&#xff0c;用 SpaceSniffer 查看C盘占用情况&#xff0c;发现浏览器的 IndexedDB 有3个文件夹占用特别大&#xff0c;从文件名看是 youku&#xff0c;bilibili&#xff0c;v.qq.com&#xff0c;浏览器的数据库并不需要长期保存&#xff0c;删除这3个文件夹&a…

MongoDB部署模式

目录 单节点模式&#xff08;Standalone&#xff09; 副本集模式&#xff08;Replica Set&#xff09; 分片集群模式&#xff08;Sharded Cluster&#xff09; MongoDB有多种部署模式&#xff0c;可以根据业务需求选择适合的架构和部署方式。 单节点模式&#xff08;Standa…

将 OneLake 数据索引到 Elasticsearch - 第二部分

作者&#xff1a;来自 Elastic Gustavo Llermaly 及 Jeffrey Rengifo 本文分为两部分&#xff0c;第二部分介绍如何使用自定义连接器将 OneLake 数据索引并搜索到 Elastic 中。 在本文中&#xff0c;我们将利用第 1 部分中学到的知识来创建 OneLake 自定义 Elasticsearch 连接器…

Formality:时序变换(三)(相位反转)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生&#xff0c;它们包括&#xff1a;时钟门控(Clock Gating)、寄存器合并(Register Merging)、…

php代码审计2 piwigo CMS in_array()函数漏洞

php代码审计2 piwigo CMS in_array()函数漏洞 一、目的 本次学习目的是了解in_array()函数和对项目piwigo中关于in_array()函数存在漏洞的一个审计并利用漏洞获得管理员帐号。 二、in_array函数学习 in_array() 函数搜索数组中是否存在指定的值。 in_array($search,$array…

房租管理系统的智能化应用助推租赁行业高效运营与决策优化

内容概要 在现代租赁行业中&#xff0c;房租管理系统的智能化应用正在逐步成为一个不可或缺的工具。通过整合最新技术&#xff0c;这些系统为租赁管理的各个方面提供了极大的便利和效率提升。从房源管理到合同签署再到财务监控&#xff0c;智能化功能能够帮助运营者在繁琐的事…

Hive关于数据库的语法,warehouse,metastore

关于数据库的语法 在default数据库下,查看其他数据库的表 in 打开控制台 字体大小的设置 Hive默认的库: default, 1/4说明一共有4个库,现在只展示了1个,单击>>所有架构 数据库的删除 方法一: 语法 删除有表的数据库,加cascade 方法二 当前连接的数据库 切换当前数据库…

【React】PureComponent 和 Component 的区别

前言 在 React 中&#xff0c;PureComponent 和 Component 都是用于创建组件的基类&#xff0c;但它们有一个主要的区别&#xff1a;PureComponent 会给类组件默认加一个shouldComponentUpdate周期函数。在此周期函数中&#xff0c;它对props 和 state (新老的属性/状态)会做一…

AI赋能医疗:智慧医疗系统源码与互联网医院APP的核心技术剖析

本篇文章&#xff0c;笔者将深入剖析智慧医疗系统的源码架构以及互联网医院APP背后的核心技术&#xff0c;探讨其在医疗行业中的应用价值。 一、智慧医疗系统的核心架构 智慧医疗系统是一个高度集成的信息化平台&#xff0c;主要涵盖数据采集、智能分析、决策支持、远程医疗等…