使用 fread 将文件内容读取到结构中

2024-02-10

在《Unix 环境中的高级编程》一书中,有一部分(第 8.14 章,第 251 页)作者向我们展示了“acct”结构(用于存储会计记录信息)的定义。然后,他展示了一个程序,在该程序中,他将文件中的会计数据读取到结构中(其关键部分是):

fread (&acdata, sizeof(acdata), 1, fp)

我遇到的麻烦是,我听说 C 编译器有时会重新排列内存中结构的元素,以便更好地利用空间(由于对齐问题)。因此,如果此代码只是获取文件的所有内容并将其粘贴到 acdata 中(并且文件的内容被排列为与结构定义中指定的顺序匹配),并且结构的某些元素已被移动,那么如果我在代码中引用它们,我可能不会得到我所期望的结果(因为文件中的数据没有像结构在内存中那样重新排列)。

我错过了什么(因为从我得到的信息来看,这似乎不可靠)?

感谢您的帮助(如果我在程序上做错了什么,我很抱歉 - 这是我第一次发帖)


Worry!

你对这个问题的担心和关注是对的。这是一个令人烦恼的问题,当您将源代码转移到另一台具有不同(甚至略有不同)架构的机器时,并且可能具有不同的操作系统或不同的编译器时,经常会发生这种情况;在那里编译你的程序;并期望你的结构保持完整fwrite( ) and fread( )。或者,当您向结构中添加 1 字节变量时,重新编译并向所有朋友发送二进制文件。由于某种神秘的原因,你的程序不再在他们的机器上运行。

有时它会起作用(偶然),但你却从未注意到这个问题;有时它不起作用,你会拔掉头发几天。

该问题与结构成员的重新排列无关。编译器不这样做。它也与优化无关。

问题是字节对齐,下面提到的维基百科文章告诉您如何修复结构,以便它们始终正确对齐。它是总是个好主意要注意字节对齐。否则你的程序不可移植。而且,更糟糕的是,您在 x86-64 上精心编译并分发给所有客户的程序突然无法在他们的 32 位计算机上运行。

同样重要的是:也要注意结构成员的长度和对齐方式。

有一个不错的维基百科文章 http://en.wikipedia.org/wiki/Data_structure_alignment这解释了细节。这是一本非常值得一读的书。

我会对完成这项工作的特定于编译器的编译指示保持警惕,但只是针对该编译器。如果您在代码中添加了编译指示,那么您的程序就不再是 C 语言了。

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

使用 fread 将文件内容读取到结构中 的相关文章

  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 跨多个控件共享事件处理程序

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

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 如何针对 Nancy 中的 Active Directory 进行身份验证?

    这是一篇过时的文章 但是http msdn microsoft com en us library ff650308 aspx paght000026 step3 http msdn microsoft com en us library
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • c 中的错误:声明隐藏了全局范围内的变量

    当我尝试编译以下代码时 我收到此错误消息 错误 声明隐藏了全局范围内的变量 无效迭代器 节点 根 我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量 我怎样才能解决这个问题 typedef node typedef struct node
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • HttpClient 像浏览器一样请求

    当我通过 HttpClient 类调用网站 www livescore com 时 我总是收到错误 500 可能服务器阻止了来自 HttpClient 的请求 1 还有其他方法可以从网页获取html吗 2 如何设置标题来获取html内容 当
  • 如何在 Team Foundation 上强制发表有意义的签入评论?

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

    By man I find printf d width num and printf 2 1 d width num 是等价的 但在我看来 第二种风格应该与以下相同 printf d num width 然而通过测试似乎man是对的 为什
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • Bing 地图运行时错误 Windows 8.1

    当我运行带有 Bing Map 集成的 Windows 8 1 应用程序时 出现以下错误 Windows UI Xaml Markup XamlParseException 类型的异常 发生在 DistanceApp exe 中 但未在用户
  • 窗体最大化时自动缩放子控件

    有没有办法在最大化屏幕或更改分辨率时使 Windows 窗体上的所有内容自动缩放 我发现手动缩放它是正确的 但是当切换分辨率时我每次都必须更改它 this AutoScaleDimensions new System Drawing Siz
  • 将变量分配给另一个变量,并将一个变量的更改反映到另一个变量中

    是否可以将一个变量分配给另一个变量 并且当您更改第二个变量时 更改会瀑布式下降到第一个变量 像这样 int a 0 int b a b 1 现在 b 和 a 都 1 我问这个问题的原因是因为我有 4 个要跟踪的对象 并且我使用名为 curr
  • php56 - CentOS - Remi 仓库

    我刚刚在测试盒上安装了 php 5 6 正常的 cli php 解释器似乎不存在 gt php v bash php command not found gt php56 v PHP 5 6 13 cli built Sep 3 2015
  • 不同类型的指针可以互相分配吗?

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

随机推荐

  • 如何查找枚举变量的参数数量?

    我有一个枚举 它代表 8080 处理器上每条可能的指令 一条指令的长度可以是 1 2 或 3 个字节 具体取决于它是否具有与其关联的信息以及数量 例如 allow non camel case types enum Instruction
  • YouTube API v3,如何获取视频资源的文件详细信息(文件名等)?

    在 YouTube API v3 中 我试图获取我自己频道上各种视频的文件详细信息 文件名等 这个链接https developers google com youtube v3 docs videos https developers g
  • Git 支持“复制到”标签吗?

    我认为这个问题需要一些背景知识 因为在 git 中可能有更好的方法来做到这一点 我有一个构建服务器 可以为我们的主要开发分支进行持续集成 这非常有效 并且显然总是在寻找变化并构建特定的分支 我还有一个 QA 版本 我们希望按需构建和部署 过
  • 如何增加报表样式中列表视图的行高?

    我需要将 2px 添加到列表视图中的行高度 自定义绘制的进度条现在太窄了 有两个很好的答案更改列表视图项目高度 https stackoverflow com questions 5569779 change listview item h
  • 如何以编程方式访问iOS系统字体

    我正在尝试更改导航栏标题的字体大小 我知道我可以使用以下方法设置其属性 var attributes NSForegroundColorAttributeName UIColor blackColor NSFontAttributeName
  • Solr 4.0 是否能够对多核使用“join”?

    我注意到 Solr 4 0 为具有关系的文档引入了 连接 功能 这很棒 但是 我注意到给出的例子http wiki apache org solr Join http wiki apache org solr Join适用于单核 所有文档都
  • 从多模块 pom 构建单个模块

    可以做吗 环境 多模块pom由3个模块组成 mm1 mm2 mm3 模块 mm2 有 mm1 作为依赖项 可以没有任何错误地构建父 pom 问题 是否可以在不将 mm1 安装到本地存储库的情况下构建单个模块 mm2 即从 mm2 基本目录运
  • 切换到 Android 应用程序包分发后,应用程序有时会崩溃并出现 Resources$NotFoundException

    App每月活跃用户超过20000人 它已经在 Google Play 上发布几个月了 在我最近从 apk 发行版切换到 aab 发行版后 我开始在 crashlytics 和 google play store 上收到随机崩溃的消息 在导致
  • 更少的变量:这可能吗

    所以我的代码在类型方面存在重大问题 但我似乎无法解决它 每当我减去1从线8有问题 我该如何解决这个问题 max columns 2 column 1 width min 30 column 2 width min 40 loop colum
  • .NET DB2 OLEDB 先决条件

    我用 C NET Framework 2 0 编写了一个 Windows 窗体应用程序 它使用System Data OleDb与 SQL Server 2000 数据库对话 该数据库运行良好 我现在需要增强应用程序以与DB2 http e
  • 使用聚合将多个函数应用于数据框中的每一列

    当我需要将多个函数按顺序应用于多个列并按多个列聚合并希望将结果绑定到我通常使用的数据框中时aggregate 通过以下方式 bogus functions foo1 lt function x mean x var x foo2 lt fu
  • npm start 如何指定index.js以外的启动文件

    我运行 create react app 然后切换到目录并运行 npm start 只是想知道如何指定一个与 index js 不同的文件在服务器上启动 这是我的 package json 文件 name todo version 0 1
  • 错误:联合中不允许复制赋值运算符

    当出现以下错误时 我正在编译下面的代码 我找不到原因 typedef union struct const int j tag X int main return 0 error member lt anonymous union gt l
  • Django 模板内部总结

    我在 django 中有以下模板 我想获取每个文档对象的最后 2 列的总计 for documento in documentos for cuenta in documento cuentasxdocumento set all tr i
  • 通过蓝牙将文件从 PC 传输到其他设备代码示例 C++ [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 Stackoverflow 用户大家好 问题 我正在寻找一些代码示例 这些示例展示了如何找到连接到我的计算机的蓝牙设备 我正在寻找一些
  • 是否有可用的 WPF“WrapGrid”控件或创建控件的简单方法?

    本质上我想要一个wrapPanel 但我希望项目能够捕捉到网格而不是被压到左侧 这样我就可以获得一个漂亮的统一外观的网格 它会自动消耗可用空间 WrapPanel 处理调整大小部分 WPF Contrib AutoGrid 处理一个很好的自
  • Android XML 属性中的星号 (*) [重复]

    这个问题在这里已经有答案了 谁能解释一下 Android XML 属性中星号的含义 允许您访问私有资源 私有资源之所以私有是有原因的 因为它们的名称将来可能会作为固件或皮肤更新的一部分而
  • 在php中对对象数组进行排序

    嗨 我想对一个对象数组进行排序 它采用数组的形式 其中包含对象 每个对象都有键 值 我想根据值对对象进行排序 问题是值包含其中有空格的数字之间 有些也是空数字 所以我无法使用 usort 对其进行排序 任何帮助将不胜感激 这是一个代码片段
  • 浏览器文本框自动完成事件,什么时候发生?

    If i dont put autocomplete off on my
  • 使用 fread 将文件内容读取到结构中

    在 Unix 环境中的高级编程 一书中 有一部分 第 8 14 章 第 251 页 作者向我们展示了 acct 结构 用于存储会计记录信息 的定义 然后 他展示了一个程序 在该程序中 他将文件中的会计数据读取到结构中 其关键部分是 frea