`fwrite` 在 `fread` 之后不能直接工作吗?

2023-12-12

我有一个使用 stdio 来读取和写入二进制文件的程序。它会缓存当前流位置,并且如果读/写偏移量已经位于所需位置,则不会进行查找。

然而,一个有趣的问题出现了,那就是当读取一个字节并写入下一个字节时,它实际上并没有被写入!

这是重现该问题的程序:

#include <cstdio>

int main() {
    FILE *f = fopen("test.bin", "wb");
    unsigned char d[1024] = { 0 };
    fwrite(d, 1, 1024, f);
    fclose(f);
    f = fopen("test.bin", "rb+");
    for (size_t i = 0; i < 1024; i++) {
        unsigned char a[1] = { 255 - (unsigned char)(i) };
        fflush(f);
        fwrite(a, 1, 1, f);
        fflush(f);
        fseek(f, i, SEEK_SET);
        fread(a, 1, 1, f);
        printf("%02X ", a[0]);
    }
    fclose(f);
    return 0;
}

你应该看到它写入字节FF向下00,但是仅写入第一个字节,因为它不跟随fread立即地。

如果它之前寻找fwrite,它的行为正确。

该问题发生在 Visual Studio 2010/2012 和 TDM-GCC 4.7.1 (Windows) 上,然而它适用于codepad我猜这是因为它是在 Linux 上执行的。

知道为什么会发生这种情况吗?


C99 §7.18.5.3/6(引自 N869 最终草案):

“当使用更新模式打开文件时(‘+’作为文件中的第二个或第三个字符 上面的模式参数值列表)[…] 输入后面不应直接跟有输出 对文件定位函数的干预调用,除非输入操作遇到结束符 文件外。”

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

`fwrite` 在 `fread` 之后不能直接工作吗? 的相关文章

  • 如何从页眉和/或页脚确定 PE 可执行文件的大小

    假设您有要雕刻的数据流或字节块 如何确定可执行文件的大小 PE 可执行文件格式中有许多标头 但是我使用哪些标头部分来确定 如果可能 可执行文件的总长度 这是文件格式的图片 如果PE文件格式良好 计算可以简化为 伪代码 size IMAGE
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • C# 用数组封送结构体

    假设我有一个类似于 public struct MyStruct public float a 我想用一些自定义数组大小实例化一个这样的结构 在本例中假设为 2 然后我将其封送到字节数组中 MyStruct s new MyStruct s
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

    我有一个开发团队有一个坏习惯 他们写道poor签入评论 当我们必须在团队基础上查看文件的历史记录时 这使得它成为一场噩梦 我已经启用了变更集评论政策 这样他们甚至可以在签到时留下评论 否则他们不会 我们就团队的工作质量进行了一些讨论 他们很
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将日期参数传递给对 MVC 操作的 ajax 调用的安全方法

    我有一个 MVC 操作 它的参数之一是DateTime如果我通过 17 07 2012 它会抛出一个异常 指出参数为空但不能有空值 但如果我通过01 07 2012它被解析为Jan 07 2012 我将日期传递给 ajax 调用DD MM
  • EPPlus Excel 更改单元格颜色

    我正在尝试将给定单元格的颜色设置为另一个单元格的颜色 该单元格已在模板中着色 但worksheet Cells row col Style Fill BackgroundColor似乎没有get财产 是否可以做到这一点 或者我是否必须在互联
  • 让 Jenkins 对远程用户不可见

    我的本地 Windows 设备上有一个 Jenkins 服务器 但我想让它对外界不可见 有关服务器的办公室规则 明显且不隐晦的 效果令人满意的方法是设置防火墙规则来阻止对其端口的传入访问 但我认为必须有一个 Jenkins 设置来阻止它向除
  • 已过时 - OpenCV 的错误模式

    我正在使用 OpenCV 1 进行一些图像处理 并且对 cvSetErrMode 函数 它是 CxCore 的一部分 感到困惑 OpenCV 具有三种错误模式 叶 调用错误处理程序后 程序终止 Parent 程序没有终止 但错误处理程序被调
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • Symfony2 - 需要帮助设置教义查询以查找标签

    我一直在广泛寻找 但仍然无法找到如何设置查询来查找用户从侧边栏中选择的特定 标签 的示例 而侧边栏又将显示带有该标签的所有帖子标签 我了解如何查找所有标签 但不了解如何查找用户选择的特定标签 博客库 public function getT
  • 如何离线安装 Visual Studio Code 扩展?

    我已在未连接也无法连接到 Internet 的计算机上安装了 Visual Studio Code 根据文档 如果我有的话 我可以从命令行安装扩展 vsix 但我不知道如何获得 vsix从市场上 我怎样才能下载 vsix对于托管在市场 更新
  • C# MYSQL - 重复键更新 - 相同查询不同结果

    在我的测试应用程序中 当我重复运行此查询时 即使没有发生任何变化 我也会得到正的行计数结果 insert into test k v values testkey 123 on duplicate key update v values v
  • 为什么没有输入函数

    我有以下 Jquery 自定义验证方法 save event challenge off click on click function e let btn e target jQuery validator addMethod minTi
  • 不适用于 iOS 7.0.3

    以下代码在 iOS 6 0 1 中完美运行 使用iOS虚拟键盘 我按下输入框上的 Go 按钮
  • 迭代 python 字典以仅检索所需的行

    我从外部源获取 HTML 表格格式的数据 from xml etree import ElementTree as ET s table tr th Release th th REFDB th th URL th tr tr td 3 7
  • 当当前访问令牌过期时,我如何获取新的访问令牌,google firebase auth?

    我在客户端使用 firebase 在服务器使用 firebase admin 在客户端 我使用 signInWithPopUp 使用 google 帐户登录我的网络应用程序 然后在客户端接收 accessToken expirationTi
  • MySQL查询以特定顺序返回结果,无需order by

    是否可以使 mysql 查询返回没有默认顺序的值 例如 我使用下面的查询 select id product name from sample where id product in 675 123 745 954 但它按 id produ
  • 解析 Unity 推送示例不起作用

    我正在努力在我的 Unity Android 应用程序上使用 Parse 已经工作了几天但还没有成功 无论我多么努力 我都无法为 Android 注册我的设备令牌 而这是向 Android 发送推送通知所需的 下面是我的示例代码和清单片段
  • C++ 友元类 std::vector

    是否可以便携地执行以下操作 struct structure structure private only allow container copy construct structure const structure in genera
  • Google 域 API 访问错误

    我是谷歌应用程序帐户用户 当我尝试访问 Google Plus Domains API 时 出现此错误 不允许访问 Google Domains API 因为用户已同意不兼容的范围 我要求的范围是 https www googleapis
  • Windows Workflow 4 关联查询在实例密钥计算中包含网站实例名称并失败

    我正在尝试在 Azure 上托管一个长时间运行的工作流服务 但我遇到了关联问题 我已将 timeToUnload 和 timeToPersist 设置为 0 并且在工作流程中勾选了 发送前保留 这不是持久性问题 而是与实例键的计算方式有关
  • 如何用concat替换pandas的append?

    你能帮我在这段代码中将append替换为concat吗 saida pd DataFrame for x y in lCodigos items try df consulta bc x logging info f Indice y li
  • C# 中根据框架版本进行条件编译

    是否有任何预处理器符号允许类似的事情 if CLR AT LEAST 3 5 use ReaderWriterLockSlim else use ReaderWriterLock endif 或其他方式来做到这一点 我认为没有任何预定义的
  • Android 支持库中的 ActionBar#setDefaultDisplayHomeAsUpEnabled 是什么?

    我知道什么setDisplayHomeAsUpEnabled确实如此 但是什么是setDefaultDisplayHomeAsUpEnabled因为我只能想知道 没有找到文档 除了正在使用之外找不到任何东西 该方法仅在Support Act
  • 审查委员会差异未上传

    我目前正在尝试使用审查板进行比较 但不断收到模糊的错误消息 Error uploading diff Your review request still exists but the diff is not attached 调试消息也没有
  • 在 PHP 中使用soap 添加 Jira 注释 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 如何在 PHP 中使用 SOAP 在 Jira 中添加注释 soapClient
  • 如何在 gnuplot 中创建 3d 相空间图?

    看这篇文章封闭但未加密 我有一些二进制数据 我想执行该文章中所示的 gnuplot 但使用我的数据 对于三维相空间图 序列 a b c d e f等可以作为空间坐标 a b b c c d b c c d d e c d d e e f 等
  • 如何在 Android OpenGL ES 中应用拖放和缩放

    我有一个问题 不知道如何添加触摸或长按来操纵 OpenGL 平移和缩放参数 目前我的编码是在手机屏幕中间显示纹理 我想用手指拖动和缩放纹理 那么如何操作OpenGL翻译和缩放参数呢 这是我的主要课程 import android app A
  • `fwrite` 在 `fread` 之后不能直接工作吗?

    我有一个使用 stdio 来读取和写入二进制文件的程序 它会缓存当前流位置 并且如果读 写偏移量已经位于所需位置 则不会进行查找 然而 一个有趣的问题出现了 那就是当读取一个字节并写入下一个字节时 它实际上并没有被写入 这是重现该问题的程序