11-13 输入输出流的位置

2023-11-09

1. 获取文件流的读取位置

        使用 ftell() 函数可以获取当前文件流的读取位置,其返回值为当前位置距 0 位置的字节数。文件以二进制形式打开后,默认从 0 位置开始读取。读取一定字节后,读取位置会向后推移该字节数。

        例如下面的代码。未读取时 position 为 0,读取 128 字节后,位置变化为 128。继续读取 128 字节,位置变化为 256。

void TestFtell(){

  FILE *file = fopen("CMakeLists.txt", "rb");

  long position = ftell(file);
  printf("position: %ld\n", position);  // position: 0

#define BUFFER_SIZE 128
  char buffer[BUFFER_SIZE];
  fread(buffer, 1, BUFFER_SIZE, file);
  position = ftell(file);
  printf("position: %ld\n", position);  // position: 128

  fread(buffer, 1, BUFFER_SIZE, file);
  position = ftell(file);
  printf("position: %ld\n", position);  // position: 256
}

2. 设定窄字符下的文件流读取位置

        使用 fseek() 函数可以设定窄字符下的文件流的读取位置。可以从开始的 0 位置(SEEK_SET)进行偏移量的设定,也可利用当前文件流的位置(SEEK_CUR)对偏移量进行设定,也可使用末尾位置(SEEK_END)设定偏移量。

void TestfSeek(){

  FILE *file = fopen("CMakeLists.txt", "rb");

  long position;

  fseek(file, 10, SEEK_SET);
  position = ftell(file);
  printf("position: %ld\n", position);  // position: 10

  fseek(file, 15, SEEK_CUR);
  position = ftell(file);
  printf("position: %ld\n", position);  // position: 25

  fseek(file, -10, SEEK_END);  // 从末尾位置前移 10 个字节
  position = ftell(file);
  printf("position: %ld\n", position);  // position: 446, 原因在于 CMakeLists.txt 共 456 个字节
}

        注意,上述 ftell() 和 fseek() 函数仅能用于二进制打开的文件,不能用于文本文件,也不能用于宽字符不能用于文本文件的原因是 C 标准未定义 ftell() 在文本文件下的返回值,即 ftell() 返回值不一定是读取的字节个数。而不能用于宽字符的原因是涉及到编码解码问题。如下图所示,中文的 “中” 字转为 utf-8 为 3 个字节,GBK 为 2 个字节。一旦使用 fseek() 函数设定偏移量,很有可能设定在 utf-8 格式的中间字节或 GBK 的末尾字节,这样就无法读取出来 “中” 这个宽字符。

3. 读取和设定宽字符下的文件流位置 

        使用 fgetpos() 和 fsetpos() 函数可以读取和设定宽字符下的文件流位置。注意二者的返回值为均为 fpos_t 类型。fgetpos() 函数获取当前文件流位置,传给 position。

void TestFsetpos(){

  FILE *file = fopen("file.txt", "w+");

  fpos_t position;
  fgetpos(file, &position);  // 获取当前文件流位置

  fputs("hello", file);

  fgetpos(file, &position);
  fsetpos(file, &position);
  printf("position: %lld", position);  // 5
}

        注意,并非所有文件都支持设定文件流位置。例如 stdout,msvc 编译器下位置默认为 0,而在 WSL 编译器位置为 -1,表示不合法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

11-13 输入输出流的位置 的相关文章

  • 编译时运算符

    有人可以列出 C 中可用的所有编译时运算符吗 C 中有两个运算符 无论操作数如何 它们的结果始终可以在编译时确定 它们是sizeof 1 and 2 当然 其他运算符的许多特殊用途可以在编译时解决 例如标准中列出的那些整数常量表达式 1 与
  • EF Core Group By 翻译支持条件总和

    听说 EF Core 2 1 将支持翻译小组 我感到非常兴奋 我下载了预览版并开始测试它 但发现我在很多地方仍然没有得到翻译分组 在下面的代码片段中 对 TotalFlagCases 的查询将阻止翻译分组工作 无论如何 我可以重写这个以便我
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • 为什么两个不同的 Base64 字符串的转换会返回相等的字节数组?

    我想知道为什么从 base64 字符串转换会为不同的字符串返回相同的字节数组 const string s1 dg const string s2 dq byte a1 Convert FromBase64String s1 byte a2
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 用于检查类是否具有运算符/成员的 C++ 类型特征[重复]

    这个问题在这里已经有答案了 可能的重复 是否可以编写一个 C 模板来检查函数是否存在 https stackoverflow com questions 257288 is it possible to write a c template
  • 从Web API同步调用外部api

    我需要从我的 Web API 2 控制器调用外部 api 类似于此处的要求 使用 HttpClient 从 Web API 操作调用外部 HTTP 服务 https stackoverflow com questions 13222998
  • 堆栈溢出:堆栈空间中重复的临时分配?

    struct MemBlock char mem 1024 MemBlock operator const MemBlock b const return MemBlock global void foo int step 0 if ste
  • 重载<<的返回值

    include
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • SolrNet连接说明

    为什么 SolrNet 连接的容器保持静态 这是一个非常大的错误 因为当我们在应用程序中向应用程序发送异步请求时 SolrNet 会表现异常 在 SolrNet 中如何避免这个问题 class P static void M string
  • 什么时候虚拟继承是一个好的设计? [复制]

    这个问题在这里已经有答案了 EDIT3 请务必在回答之前清楚地了解我要问的内容 有 EDIT2 和很多评论 有 或曾经 有很多答案清楚地表明了对问题的误解 我知道这也是我的错 对此感到抱歉 嗨 我查看了有关虚拟继承的问题 class B p
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • C# 模拟VolumeMute按下

    我得到以下代码来模拟音量静音按键 DllImport coredll dll SetLastError true static extern void keybd event byte bVk byte bScan int dwFlags

随机推荐

  • 关于火星坐标系统

    转载 关于火星坐标系统 2011 09 08 23 11 57 分类 默认分类 字号 订阅 偶然得知中国有一种火星坐标系统 其原理是这样的 保密局开发了一个系统 能将实际的坐标转换成虚拟的坐标 所有在中国销售的数字地图必须使用这个系统进行坐
  • 显示Hello World

    C 语言 include iostream using namespace std int main cout lt lt Hello World lt
  • 没有编程基础,可以自学Python吗?

    可以 Python是一门简单优雅的计算机程序设计语言 自身的特点决定了它是一门易学难精的语言 所以对于零基础学员而言 只要肯努力 学习是没有问题的 下面说说相比于C语言 Java语言 Python的特点 Python语法简单 代码可读性高
  • 性能监控-influxDB+grafana+jmeter展示测试结果

    InfluxDB 是 Go 语言编写的时间序列数据库 用于处理海量写入与负载查询 涉及大量时间戳数据的任何用例 包括 DevOps 监控 应用程序指标等 我认为 InfluxDB 最大的特点在于可以按照时间序列面对海量数据时候的高性能读写能
  • 高数【求导】--猴博士爱讲课

    第三课 求导 1 5 照公式求导 常见的求导 2 5 隐函数求导 例 1 若 y y
  • spring Aop嵌套调用的解决办法

    众所周知 Spring AOP在同一个类里自身方法相互调用时是无法拦截的 问题示例代码 public String say String a System out println say a a say2 a return a a publ
  • px、em、rem、rpx 用法 与 区别

    这篇文章记录前端 包含小程序 开发中常用到的几个单位 px em rem rpx 的区别和用法 px px像素 Pixel 相对长度单位 像素px是相对于显示器屏幕分辨率而言的 PX特点 1 IE无法调整那些使用px作为单位的字体大小 2
  • 消息中间件 RocketMQ 源码解析:Message拉取&消费(上)

    摘要 原创出处 http www iocoder cn RocketMQ message pull and consume first 芋道源码 欢迎转载 保留摘要 谢谢 本文主要基于 RocketMQ 4 0 x 正式版 1 概述 2 C
  • std::vector push_back报错Access violation

    C C code 1 2 3 4 5 6 7 8 9
  • 简单聊聊FPGA的一些参数

    笔者 E林1010 在上一篇中 我们已经知道了 FPGA的几个主流厂家和其中Intel家族中FPGA的系列的分类 上一篇文章链接 https mp weixin qq com s 1YufdRZ3Kvvk1znDGu69Og 本文微信公众号
  • word无法显示图片的问题终于搞定!oh yeah!

    我的word中的图片只显示一个方框 这个问题困扰我有一段时间了 今天终于搞定 原因如下 Word中不能显示公式 问 在Word 2003中编辑好的公式无法显示 只显示为一个方框 该怎么办 答 Word把使用公式编辑器输入的公式作为图形处理
  • SPECCPU 2017测试指导

    一 依赖包下载安装 安装前需要安装依赖包 可通过本地源进行安装 yum install gcc gfortran 离线场景下需要外网下载好后传到本地再安装 Deepin gfortran安装包手动安装3个gfortran的包 可选 yum
  • UDS应用层协议解析(史上最全)

    UDS应用层协议解析 UDS应用层协议解读 下 诊断服务分类 基础服务类 0x10 诊断会话模式 任何会话模式切换至默认会话模式时 非默认会话模式下设置的状态需要reset 28服务 85服务设置的状态需要恢复至默认状态 27服务解锁状态需
  • Win平台搭建WordPress环境

    Win平台搭建WordPress环境 WordPress是一个开源流行的个人信息发布平台 使用PHP编写 现在有众多的网站都使用WordPress来搭建的 同时WordPress还提供了大量的插件 能够帮助人们搭建个性化的网站 安装PHP
  • 在IntelliJ IDEA上使用Maven创建Spring项目HelloWorld

    因为IDEA自带Maven插件 所以使用IDEA是不需要在下载Maven的文件的 也可使用自己下载的Maven Spring我们则是通过Maven来下载构建 所以不需要下载jar包的 大神勿喷 请自行绕道 本博客面向第一次接触spring的
  • 使用Python绘制语音信号的波形图

    improt library import numpy as np import wave import pylab as pl download open souce audio in http www voiptroubleshoote
  • (一)基于物联网的智能安防监控机器人2207231212569

    基于物联网的智能安防监控机器人2207231212569 项目摘要 机器人是人类一直期待的东西 但自动化的东西有点不同 理想情况下 机器人能够做的事情比自动化机器人想做的要多得多 自动化机器人希望实现监控和制造商想要实现的另一主要可用性 但
  • 【六袆 - Dubbo】Dubbo服务的简单调用;

    这里写目录标题 1 Dubbo服务的基本调用过程 1 1在Java中定义dubbo服务 以interface接口的方式 1 2 Provider提供服务的具体实现 并声明为dubbo服务 1 3 Consumer使用dubbo服务 1 Du
  • ArrayList LinkedList Set HashMap介绍

    在Java中提供了Collection和Map接口 其中List和Set继承了Collection接口 同时用Vector ArrayList LinkedList三个类实现List接口 HashSet TreeSet实现Set接口 直接有
  • 11-13 输入输出流的位置

    1 获取文件流的读取位置 使用 ftell 函数可以获取当前文件流的读取位置 其返回值为当前位置距 0 位置的字节数 文件以二进制形式打开后 默认从 0 位置开始读取 读取一定字节后 读取位置会向后推移该字节数 例如下面的代码 未读取时 p