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# ./testsize 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::ofstreamint 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::ifstreamint 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.";elsestd::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# ./testReading 18 characters... all characters read successfully.


相关文章:
Linux C\C++编程-文件位置指针与读写文件数据块
【图书推荐】《Linux C与C一线开发实践(第2版)》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践(第2版)(Linux技术丛书)》(朱文伟,李建英)【摘要 书评 试读】- 京东图书 Linu…...
Flask简介与安装以及实现一个糕点店的简单流程
目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…...
【自动化测试】—— Appium使用保姆教程
目录 一. 连接手机 1. 授权 2. 调试 3. 获取参数 二. 启动APP 1. 启动Appium服务 2. 启动Appium Inspector 3. 配置Appium Inspector 三. 功能说明 1. 主菜单功能 2. 快照视图菜单 3. 元素视图菜单 四. 常见问题 1. appPackage有多个设备时 一. 连接手机 1. 授权 首先将手机的开…...
西门子【Library of General Functions (LGF) for SIMATIC S7-1200 / S7-1500】
文章目录 概要整体架构流程技术名词解释技术细节小结 概要 通用函数库 (LGF) 扩展了 TIA Portal 中用于 PLC 编程的 STEP 7 指令(数学函数、时间、计数器 等)。该库可以不受限制地使用,并包含 FIFO 、搜索功能、矩阵计算、 astro 计…...
IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载
IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载 在 IntelliJ IDEA 2023.3 中配置 Spring Boot 项目的热加载,可以让你在不重启应用的情况下看到代码修改的效果。以下是详细的配置步骤: 添加 spring-boot-devtools 依赖 在 pom.xml 文件中添加 …...
Python----Python高级(正则表达式:语法规则,re库)
一、正则表达式 1.1、概念 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、 regexp或RE),是一种文本模式,包括普通字符(例如,a 到 z 之间的字母࿰…...
通过Ukey或者OTP动态口令实现windows安全登录
通过 安当SLA(System Login Agent)实现Windows安全登录认证,是一种基于双因素认证(2FA)的解决方案,旨在提升 Windows 系统的登录安全性。以下是详细的实现方法和步骤: 1. 安当SLA的核心功能 安…...
Node.js接收文件分片数据并进行合并处理
前言:上一篇文章讲了如何进行文件的分片:Vue3使用多线程处理文件分片任务,那么本篇文章主要看一下后端怎么接收前端上传来的分片并进行合并处理。 目录: 一、文件结构二、主要依赖1. express2. multer3. fs (文件系统模块)4. pat…...
Lsky-Pro在线图片搭建教程(Docker部署方式)
Lsky Pro+ 是一个使用 PHP 语言,采用 Laravel 框架开发的一款 Web 图片管理程序,中文名:兰空图床。如果你需要一个在线图床程序,那么这个开源项目可以帮助到你,部署流程非常简单。本章教程记录如何部署Lsky-Pro。 一、拉取镜像 docker pull halcyonazure/lsky-pro-docke…...
“深入浅出”系列之算法篇:(2)openCV、openMV、openGL
OpenCV是一个的跨平台计算机视觉库,可以运行在Linux囚、Windows 和Mac OS操作系统上。它轻量级而且高效,由一系列 C函数和少量C类构成,同时也提供了Python 接口,实现了图像处理和计算机视觉方面的很多通用算法。 OpenMV是一个开源,低成本&am…...
AI 新动态:技术突破与应用拓展
目录 一.大语言模型的持续进化 二.AI 在医疗领域的深度应用 疾病诊断 药物研发 三.AI 与自动驾驶的新进展 四.AI 助力环境保护 应对气候变化 能源管理 后记 在当下科技迅猛发展的时代,人工智能(AI)无疑是最具影响力的领域之一。AI 技…...
从CRUD到高级功能:EF Core在.NET Core中全面应用(三)
目录 IQueryable使用 原生SQL使用 实体状态跟踪 全局查询筛选器 并发控制使用 IQueryable使用 在EFCore中IQueryable是一个接口用于表示可查询的集合,它继承自IEnumerable但具有一些关键的区别,使得它在处理数据库查询时非常有用,普通集…...
【记录】Jenkins版本及JDK关系介绍的官网地址
Redhat Jenkins Packages...
vue3-json-viewer和vue-json-pretty插件使用,vue3 json数据美化展示
本文介绍vue3如何进行json数据pretty展示 1 vue3-json-viewer 1.1 安装 npm install vue3-json-viewer --save1.2 全局引入 在main.ts中引入,然后直接在组件中使用 import { createApp } from vue import App from ./App.vue import JsonViewer from "vue3…...
python转转商超书籍信息爬虫
1基本理论 1.1概念体系 网络爬虫又称网络蜘蛛、网络蚂蚁、网络机器人等,可以按照我们设置的规则自动化爬取网络上的信息,这些规则被称为爬虫算法。是一种自动化程序,用于从互联网上抓取数据。爬虫通过模拟浏览器的行为,访问网页并…...
Spring Boot 中的 InitializingBean:Bean 初始化背后的故事
在 Spring Boot 应用中,Bean 的生命周期管理至关重要。InitializingBean 接口允许 Bean 在完成属性注入后执行自定义初始化逻辑。本文将深入探讨 InitializingBean 接口在 Spring Boot 中的应用,揭示其工作原理,并分享一些最佳实践࿰…...
微信小程序:实现单选,多选,通过变量控制单选/多选
一、实现单选功能 微信小程序提供了 radio 组件来实现单选功能。radio 组件需要配合 radio-group 使用。 1. WXML 代码 <radio-group bindchange"onRadioChange"><label wx:for"{{items}}" wx:key"id"><radio value"{{it…...
MOS怎样选型,步骤详解
一:选用N沟道还是P沟道 为设计选择正确器件的第一步是决定采用N沟道还是P沟道MOSFET。在典型的功率应用中,当一个MOSFET接地,而负载连接到干线电压上时,该MOSFET就构成了低压侧开关。在低压侧开关中,应采用N沟道M…...
CMake技术细节:解决未定义,提供参数
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
1688 满足跨境业务需求而提供的一组 API 接口
1688 跨境属性接口系列是 1688 开放平台为满足跨境业务需求而提供的一组 API 接口,其中最主要的是1688.item_get : 一:1688.item_get接口 接口功能:主要用于查询 1688 商品的跨境属性,为开发者和商家提供了获取商品跨境关键信息…...
李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本:从数学公式到可执行代码
李慕婉-仙逆-造相Z-Turbo 生成Matlab算法脚本:从数学公式到可执行代码 最近在帮一个做信号处理的朋友调试代码,他给我看了一页论文里的公式,问我怎么在Matlab里实现。我盯着那一堆希腊字母和矩阵运算,突然想到,要是能…...
猫抓浏览器资源嗅探扩展完全指南:从新手到高手的蜕变之路
猫抓浏览器资源嗅探扩展完全指南:从新手到高手的蜕变之路 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 网络上丰富的视频、音频和图片…...
3步搞定Mac NTFS读写:开源工具Nigate让跨平台文件传输无忧
3步搞定Mac NTFS读写:开源工具Nigate让跨平台文件传输无忧 【免费下载链接】Free-NTFS-for-Mac Nigate: An open-source NTFS utility for Mac. It supports all Mac models (Intel and Apple Silicon), providing full read-write access, mounting, and managemen…...
避开地图偏移的坑:GCJ02/WGS84/BD09坐标系转换原理与最佳实践
多地图平台开发中的坐标系转换实战指南 当你在地图上看到一个标注点时,是否想过这个位置背后可能经历了多次数学变换?不同地图服务商使用着各自的坐标系标准,而开发者需要在这些差异中搭建桥梁。本文将深入解析主流坐标系特性,并提…...
软件驱动与应用开发-RK3588实战
一、RK3588设备树关键配置 1.1 I2C与SPI引脚复用配置 dts // 文件: rk3588-smart-monitor.dts / {// I2C2: 使用GPIO4_B1/B2 (功能3)&i2c2 {status = "okay";clock-frequency = <400000>;pinctrl-0 = <&i2c2m0_xfer>;pinctrl-names = "d…...
别再到处找瓦片服务地址了!手把手教你用OpenLayers 7.x集成天地图和高德地图(附完整代码)
OpenLayers 7.x实战:深度解析天地图与高德地图集成方案 第一次接触地图开发时,最让我头疼的不是写代码,而是找不到正确的瓦片服务地址。那些看似简单的URL背后,藏着各种参数玄机——为什么别人的地图能正常显示中文标注࿱…...
3步解锁旧内核:KernelSU在Linux 4.14+设备上的完整适配指南
3步解锁旧内核:KernelSU在Linux 4.14设备上的完整适配指南 【免费下载链接】KernelSU A Kernel based root solution for Android 项目地址: https://gitcode.com/GitHub_Trending/ke/KernelSU 你是否还在为Android设备的内核版本过低而无法使用KernelSU感到…...
ROS1环境下Intel RealSense深度相机:从零部署到点云应用实战
1. 环境准备:从零搭建ROS1与RealSense开发环境 第一次接触ROS和深度相机的开发者,往往会卡在环境配置这一步。我当年用D435i做项目时,光是驱动兼容性问题就折腾了两天。下面这套配置流程经过多个项目验证,特别适合Ubuntu 18.04/20…...
在RK3588上搞定XDMA AXI-Stream回环测试:从Verilog到Rust的完整流程与避坑指南
RK3588平台XDMA AXI-Stream全链路开发实战:从FPGA设计到Rust测试的工程化实现 当我们需要在嵌入式系统中实现高速数据交换时,PCIeAXI-Stream的组合无疑是黄金搭档。RK3588作为一款高性能处理器,配合FPGA的灵活可编程特性,能够构建…...
Google Cloud Vision API:为什么你的应用需要“看懂”图片的超能力?
Google Cloud Vision API:为什么你的应用需要“看懂”图片的超能力? 【免费下载链接】cloud-vision Sample code for Google Cloud Vision 项目地址: https://gitcode.com/gh_mirrors/cl/cloud-vision 你是否曾想过,如果应用能像人类一…...
