将二进制文件读入结构 (C++)

2024-01-11

所以我遇到了一些无法正确地将二进制文件读入我的结构的问题。结构是这样的:

struct Student
{
    char name[25];
    int quiz1;
    int quiz2;
    int quiz3;
};

它有 37 个字节(来自 char 数组的 25 个字节,每个整数 4 个字节)。我的 .dat 文件有 185 字节。共有 5 名学生,成绩为 3 个整数。所以每个学生占用37个字节(37*5=185)。

纯文本格式看起来像这样:

Bart Simpson          75   65   70
Ralph Wiggum          35   60   44
Lisa Simpson          100  98   91
Martin Prince         99   98   99
Milhouse Van Houten   80   87   79

我可以使用以下代码单独读取每条记录:

Student stud;

fstream file;
file.open("quizzes.dat", ios::in | ios::out | ios::binary);

if (file.fail())
{
    cout << "ERROR: Cannot open the file..." << endl;
    exit(0);
}

file.read(stud.name, sizeof(stud.name));
file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));

while(!file.eof())
{
    cout << left 
         << setw(25) << stud.name
         << setw(5)  << stud.quiz1
         << setw(5)  << stud.quiz2
         << setw(5)  << stud.quiz3
         << endl;

    // Reading the next record
    file.read(stud.name, sizeof(stud.name));
    file.read(reinterpret_cast<char *>(&stud.quiz1), sizeof(stud.quiz1));
    file.read(reinterpret_cast<char *>(&stud.quiz2), sizeof(stud.quiz2));
    file.read(reinterpret_cast<char *>(&stud.quiz3), sizeof(stud.quiz3));
}

我得到了一个漂亮的输出,但我希望能够一次读取一个完整的结构,而不仅仅是一次读取每个结构的各个成员。我认为这段代码是完成任务所需的,但是......它不起作用(我将在它之后显示输出):

*不包括文件打开和结构声明等类似部分。

file.read(reinterpret_cast<char *>(&stud), sizeof(stud));

while(!file.eof())
{
    cout << left 
         << setw(25) << stud.name
         << setw(5)  << stud.quiz1
         << setw(5)  << stud.quiz2
         << setw(5)  << stud.quiz3
         << endl;

    file.read(reinterpret_cast<char *>(&stud), sizeof(stud));
}

OUTPUT:

Bart Simpson             16640179201818317312
ph Wiggum                288358417665884161394631027
impson                   129184563217692391371917853806
ince                     175193530917020655191851872800

唯一没有搞乱的部分是第一个名字,之后就是下山了。我已经尝试了一切,但我不知道出了什么问题。我什至翻遍了我拥有的书籍,但没有找到任何东西。里面的东西看起来和我的一样并且可以工作,但由于某种奇怪的原因我的却不能。我在字节 25 处执行了 file.get(ch) (ch 是一个字符),它返回了 K,它是 75 的 ASCII 码……这是第一个测试分数,所以,一切都在它应该在的地方。它只是没有正确读取我的结构。

任何帮助将不胜感激,我只是坚持这个。

EDIT:在收到你们这么多意想不到的、令人敬畏的意见后,我决定采纳你们的建议,坚持一次阅读一名成员。我通过使用函数使事情变得更干净、更小。再次感谢您提供如此快速且富有启发性的意见。非常感谢。

如果你有兴趣在大多数人不推荐的解决方法中,向底部滚动到 user1654209 的第三个答案。该解决方法完美无缺,但请阅读所有评论以了解为什么它不受欢迎。


您的结构几乎肯定已被填充以保持其内容的对齐。这意味着它不会是 37 个字节,并且这种不匹配会导致读数不同步。从每个字符串丢失 3 个字符的方式来看,它似乎已被填充到 40 个字节。

由于填充可能位于字符串和整数之间,因此即使第一条记录也无法正确读取。

在这种情况下,我建议不要尝试将数据作为二进制 blob 读取,而坚持读取各个字段。它更加强大,特别是如果您甚至想改变您的结构。

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

将二进制文件读入结构 (C++) 的相关文章

  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 访问私人成员[关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 通过将类的私有成员转换为 void 指针 然后转换为结构来访问类的私有成员是否合适 我认为我无权修改包含我需要访问的数据成员的类 如果不道德 我
  • C# 和 Javascript SHA256 哈希的代码示例

    我有一个在服务器端运行的 C 算法 它对 Base64 编码的字符串进行哈希处理 byte salt Convert FromBase64String serverSalt Step 1 SHA256Managed sha256 new S
  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • pthread_cond_timedwait() 和 pthread_cond_broadcast() 解释

    因此 我在堆栈溢出和其他资源上进行了大量搜索 但我无法理解有关上述函数的一些内容 具体来说 1 当pthread cond timedwait 因为定时器值用完而返回时 它如何自动重新获取互斥锁 互斥锁可能被锁定在其他地方 例如 在生产者
  • Newtonsoft JSON PreserveReferences处理自定义等于用法

    我目前在使用 Newtonsoft Json 时遇到一些问题 我想要的很简单 将要序列化的对象与所有属性和子属性进行比较以确保相等 我现在尝试创建自己的 EqualityComparer 但它仅与父对象的属性进行比较 另外 我尝试编写自己的
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • Json.NET - 反序列化接口属性引发错误“类型是接口或抽象类,无法实例化”

    我有一个类 其属性是接口 public class Foo public int Number get set public ISomething Thing get set 尝试反序列化Foo使用 Json NET 的类给我一条错误消息
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 指针减法混乱

    当我们从另一个指针中减去一个指针时 差值不等于它们相距多少字节 而是等于它们相距多少个整数 如果指向整数 为什么这样 这个想法是你指向内存块 06 07 08 09 10 11 mem 18 24 17 53 7 14 data 如果你有i
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • 在数据库中搜索时忽略空文本框

    此代码能够搜索数据并将其加载到DataGridView基于搜索表单文本框中提供的值 如果我将任何文本框留空 则不会有搜索结果 因为 SQL 查询是用 AND 组合的 如何在搜索 从 SQL 查询或 C 代码 时忽略空文本框 private
  • 将 xml 反序列化为类,list<> 出现问题

    我有以下 XML
  • C++ 复制初始化和直接初始化,奇怪的情况

    在继续阅读本文之前 请阅读在 C 中 复制初始化和直接初始化之间有区别吗 https stackoverflow com questions 1051379 is there a difference in c between copy i
  • 插入记录后如何从SQL Server获取Identity值

    我在数据库中添加一条记录identity价值 我想在插入后获取身份值 我不想通过存储过程来做到这一点 这是我的代码 SQLString INSERT INTO myTable SQLString Cal1 Cal2 Cal3 Cal4 SQ
  • 将文本叠加在图像背景上并转换为 PDF

    使用 NET 我想以编程方式创建一个 PDF 它仅包含一个背景图像 其上有两个具有不同字体和位置的标签 我已阅读过有关现有 PDF 库的信息 但不知道 如果适用 哪一个对于如此简单的任务来说最简单 有人愿意指导我吗 P D 我不想使用生成的
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • org.openqa.selenium.WebDriverException:尚未定义命令或响应编解码器。无法继续

    我正在使用 appium 来自动化移动应用程序 但是当我尝试在应用程序上执行某些操作 即单击登录按钮 时 在模拟器或移动设备上启动应用程序后 会发生上述异常 有人知道它出了什么问题吗 gt 错误截图 https i stack imgur
  • 当一个方法被多次调用时,@RequestParam变量返回一组逗号分隔的值

    我刚刚注意到 当连续多次调用控制器方法时 用于检查 POST 参数 例如用户名或 id 的 RequestParam 变量的行为相当奇怪 它不返回当前参数值 例如 Jason Michael John 而是返回之前调用该方法所用的所有参数值
  • 禁用时省略 editText 的内容

    我有一个布局 其中 EditText 由用户填充 然后它被禁用以充当标准 TextView 问题是 椭圆形永远不适用于此 EditText 我希望它在文本太大而无法完全显示时在文本末尾显示 但我找不到任何方法让它起作用 而且我不知道为什么它
  • Cassandra 和非结构化数据

    我对 NoSQL 还比较陌生 但我已经对关系数据库进行了相当多的尝试 我们正在评估 Cassandra 在数据模型可能需要相当积极地发展的环境中的使用情况 我看到它在多个地方写到 Cassandra 可以存储 结构化 半结构化和非结构化 数
  • 两个黑莓模拟器之间的短信

    如何编写程序以使用 BlackBerry JDE 在两个 BlackBerry 模拟器之间发送和接收 SMS 您需要使用以下参数从命令行启动模拟器 sms source port uint sms destination port uint
  • iOS:UIBezierPath 和 CAShapeLayer fillRule

    我都用过UIBezierPath and CAShapeLayer前 但几乎每次都会结合用内部颜色填充路径中包含的对象 但我想这次填充包含的对象外部的颜色UIBezierPath 我刚刚编写并运行了以下简单的代码 试图让自己熟悉fillRu
  • 哈希值和加盐值

    我正在开发一个小型网络应用程序 可以在内部对用户进行身份验证 一旦用户通过身份验证 我的 Web 应用程序就会将一些信息 例如用户 ID 和人员姓名 传递给第三方 Web 应用程序 第三方开发人员建议我们对这些值进行哈希和加盐 原谅我的无知
  • 仅当窗口尚不存在时 JavaScript window.open

    我有一个应用程序 单击链接后会打开一个新窗口 这会生成一个包含 Java 小程序的页面 我遇到的问题是 单击同一链接会重新加载页面 从而重置 Java 应用程序 有什么办法可以捕获这个吗 可以接受的两种解决方案是 允许从单击处理程序打开多个
  • 为什么运行时会出现错误(使用“clojure.contrib.repl-utils”)?

    我发现我可以通过阅读 Programming Clojure 一书第 20 页 使用 Chris Houser 的 repl utils 库 clojure contrib repl utils source 或 show 来深入了解 Ja
  • gem yank 失败“版本不存在”

    我试图在 ruby gems com 上替换我的 gem 的错误版本 但猛拉失败 你可以看到https rubygems org gems v2gpti https rubygems org gems v2gpti该 gem 在 v0 2
  • 从共享库使用时,imbue/facet 会被忽略,具体取决于 Android 下的动态加载顺序

    我正在 Android 上部署一个 C 应用程序 它使用boost date time 它有很多库 一些在编译时链接 共享库 其他一些是插件 在运行时动态加载dlopen 在某些库中 设置boost posix time time face
  • 将 docker-compose 转换为 Helm Chart?

    我有一个 docker compose 文件 其中包含我正在使用的安全工具的 2 个图像 我的挑战是将其转换为由deployment yaml和service yaml组成的helm图表 docker compose 看起来像这样 vers
  • 只读静态字段初始化的线程安全

    如果创建一个像这样的只读静态成员 public sealed class MyClass public readonly static MyClass Instance new MyClass 我们知道 如果某个线程第一次访问 MyClas
  • 当字节可用时,.Net SerialPort 需要 0.5 秒以上的时间来读取字节

    我正在使用 C 中的 Net SerialPort 类从端口读取字节 收到 DataReceived 事件后 我检查串行端口以查看是否有字节可供读取 然而 即使字节可用 端口也可能需要半秒以上的时间来读取单个字节 代码大致如下 while
  • 裸字符串的数组等效项

    我可以毫无问题地做到这一点 const char foo This is a bare string 我想要的是能够对数组做同样的事情 const int bar 1 2 3 显然该代码无法编译 但是是否有某种与裸字符串等效的数组 你不能这
  • 全局变量和静态全局变量[重复]

    这个问题在这里已经有答案了 在 C 中 全局变量 const 和全局静态变量 const 之间有什么区别吗 在cpp文件或头文件中声明 static const int x1 someFunction 5 const int x2 some
  • iPhone UITableView。如何打开音乐应用程序中的单字母字母列表?

    在 iPhone 音乐应用程序中 选择 艺术家 歌曲 或 专辑 会在 UI 右侧呈现一个带有单个字母垂直列表的 tableView 可实现快速滚动 如何在我的应用程序中启用此功能 干杯 道格 提供您自己的索引字符 NSArray secti
  • 没有可用的隐式视图

    当尝试批量加载列表时DBObject s via insert http api mongodb org scala casbah 2 1 2 scaladoc com mongodb casbah MongoCollection html
  • 删除和/或更新系统的 Python 时虚拟环境的后果

    编辑清楚 这个问题是参考venv https docs python org 3 library venv html 这经常与虚拟环境 https virtualenv pypa io 删除系统的 Python 安装 它是用于在系统上创建虚
  • 将二进制文件读入结构 (C++)

    所以我遇到了一些无法正确地将二进制文件读入我的结构的问题 结构是这样的 struct Student char name 25 int quiz1 int quiz2 int quiz3 它有 37 个字节 来自 char 数组的 25 个