- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以今天我在编程方面几乎没有取得任何进展,因为我非常缓慢地意识到 C++ 是一种对类型非常敏感的语言,如果结构的其中一个成员是类型,我就不能将结构附加到二进制文件字符串类。在我发现之前,我不知道是这种情况。我先证明我的观点。
此代码将不起作用:
#include <iostream>
#include <string>
#include <fstream>
using namespace std;
// function Headers:
void Receive_Information(fstream& personal_data);
void Display_Information(fstream& personal_data);
struct Info
{
string name; // if this is char name[50]; ... it works perfectly.
float weight;
char grade;
};
int main()
{
fstream personal_data;
// Get two people from the stream:
Receive_Information(personal_data);
Receive_Information(personal_data);
// Now display their information from the binary file.
Display_Information(personal_data);
return 0;
}
void Receive_Information(fstream& personal_data)
{
personal_data.open("personal_data.dat", ios::out | ios::app | ios::binary); // open a binary file for appending.
Info person; // This structure variable is written to the binary file.
cout << "What is the person's name: ";
getline(cin, person.name); // change to cin.getline(person.name, 50) when defined as a character array
cout << "\nWhat is this individual's weight: ";
cin >> person.weight;
cout << "\nWhat letter grade (A, B, C, D, F) did s(he) get on the last exam: ";
cin >> person.grade;
// write the structure variable to file.
personal_data.write(reinterpret_cast<char *>(&person), sizeof(person));
cin.ignore();
personal_data.close(); // close the file after writing to it.
cout << endl;
}
void Display_Information(fstream& personal_data)
{
Info person_out; // This is the structure variable we get from opening the binary file.
personal_data.open("personal_data.dat", ios::in | ios::binary); // Open the binary file to read from.
personal_data.read(reinterpret_cast<char *>(&person_out), sizeof(person_out)); // Read the first line of the file.
while(personal_data) // While I haven't reached the end of the file keep reading in the information.
{
cout << "The weight of the person is " << person_out.weight << endl;
cout << "The person's name is " << person_out.name << endl; // This can't be printed because it's a string.
cout << "The grade this individual received on the last exam is " << person_out.grade << endl;
personal_data.read(reinterpret_cast<char *>(&person_out), sizeof(person_out));// keep pulling information from the file.
cout << endl;
}
personal_data.close();
}
如果我按预期运行程序,那么我会得到以下输出:
What is the person's name: Generic Me
What is this individual's weight: 180
What letter grade (A, B, C, D, F) did s(he) get on the last exam: A
What is the person's name: Suspicious You
What is this individual's weight: 200
What letter grade (A, B, C, D, F) did s(he) get on the last exam: C
The weight of the person is 180
The person's name is // it's no coincidence that it fails here.
Process returned 255 (0xFF) execution time : 25.193 s
Press any key to continue.
请注意,函数 Display_Information() 被特意安排为首先显示重量,然后是字符串类型的名称。我这样做是为了证明我的观点,即结构的成员可以从二进制文件中读取,但直到其中一个变量是字符串,程序才会中止。
所以我的假设是,如果其中一个成员类型为字符串,则结构不能轻易写入二进制文件。为了证明我的观点,如果我将名称更改为字符数组,那么一切正常。
所以为了摆脱困惑,我将手动删除二进制文件 personal_data.dat,然后重新运行程序,只做这两个小改动......
我会改变
struct Info
{
string name; // if this is char name[50]; ... it works perfectly.
float weight;
char grade;
};
为此:
struct Info
{
char name[50]; // A character array which can hold about 50 characters.
float weight;
char grade;
};
然后在 Receive_Information 函数中我将更改它:
getline(cin, person.name);
对此
cin.getline(person.name, 50);
一切都会神奇地起作用!!看看它是如何完美运作的!
What is the person's name: Generic Me
What is this individual's weight: 180
What letter grade (A, B, C, D, F) did s(he) get on the last exam: A
What is the person's name: Suspicious You
What is this individual's weight: 200
What letter grade (A, B, C, D, F) did s(he) get on the last exam: C
The weight of the person is 180
The person's name is Generic Me
The grade this individual received on the last exam is A
The weight of the person is 200
The person's name is Suspicious You
The grade this individual received on the last exam is C
Process returned 0 (0x0) execution time : 12.998 s
Press any key to continue.
现在我已经证明了我关于结构中的字符串的观点,是否可以做任何事情(不使用字符)来使我的原始程序在附加到二进制文件时使用结构中的字符串数据成员。顺便说一句,我还发现我的结构变量 person 可以写入一个带有字符串成员的二进制文件,然后成功读取,但是当你尝试附加多个结构时,你的程序就不太喜欢你了。很奇怪。
想法。
最佳答案
不要使用reinterpret_cast
用于序列化/反序列化或字符串化。 reinterpret_cast
是一种非常危险的工具,只能在非常特殊的情况下使用。处理您的问题的正确方法是提供 operator<<
和一个 operator>>
为你的 Info
类(class)。示例:
std::ostream& operator<<(std::ostream& os, const Info& p)
{
os << name;
os << weight;
os << grade;
return os;
}
reinterpret_cast<T>
从字面上要求编译器查看内存位置并将其视为 T
。 .类 std::string
很复杂:它们拥有资源并在其中存储指向其他内存位置的指针。如果您尝试写入 std::string
的字节out,你会得到垃圾,因为你的角色可能没有存储在 std::string
中实例本身...
关于c++ - 为什么 C++ 拒绝将结构附加到包含字符串类成员的二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46949784/
我只想允许一个国家/地区访问,但排除该国家/地区内的代理。 这就是我所拥有的(为了方便起见,缩短了版本) order deny,allow deny from all allow from 139.
这个问题在这里已经有了答案: What is an unhandled promise rejection? (9 个回答) 关闭 4 年前。 我目前正在尝试实现我自己的 Promise,以便在 A
我在使用 Gitolite 推送 git 时遇到问题。 当我尝试这个时: git push origin :refs/tags/deployment 我收到这个错误: remote: D NAME/i
我已经为我的 laravel 5.0-dev 项目配置了 mysql,如下所示: 'mysql' => [ 'driver' => 'mysql', 'host' =>
我对 Web 和 SOF 进行了一些研究,但发现对于该错误没有任何真正的帮助。 我使用 Windows 10 Ubuntu Bash 安装了 Node 和 Puppeteer,但未能使其工作,但我设法
在我的应用审核期间,我收到了以下信息: “17.2:要求用户共享个人信息(例如电子邮件地址和生日)才能正常运行的应用将被拒绝 具体来说,您的应用仅使用Facebook登录名进行身份验证,但不包括该网站
我正在开发 VeriFone VX 终端的接口(interface)。虽然,这确实是一个普遍的 EMV 问题。我们的处理器的下限为零,因此它将始终在线发送。但是,如果它发生变化,您如何知道(哪些标签)
我编写了一些宏代码,根据表单提交向经理发送电子邮件(用于费用/审批流程),这是我使用谷歌表单/电子表格的第一个项目,所以也许我可能会错过一些简单的东西,但我为此浏览了 2 个教程,我的代码与重要的部分
clang 3.4 接受以下代码;而 vc++ NOV 2013 CTP 拒绝它并出现错误: error C2668: 'AreEqual' : ambiguous call to overloade
使用 nginx,您可以允许和拒绝范围和 ips (https://www.nginx.com/resources/admin-guide/restricting-access/)。使用realip模
官方编辑: 非常感谢您的帮助,但我仍然遇到问题。 我的 ffserver.conf 文件是这样的: # Port on which the server is listening. You must
我有一个问题:我是 Ubuntu 系统的根。我想授予用户(比如用户名是 X)执行任何命令的权限,但同时我有一个文件夹,除了我的用户(当然不是 X,因为它是 Admin ) 或根。有什么建议么?谢谢!
我使用 Apache2.2 作为 tomcat 服务器的前端。我想限制对某个位置的访问,但允许对子位置的所有访问,但遇到了一些麻烦。 我目前拥有的是: AllowOverride None
就像 this person ,我一直在为浏览器缓存 SSL session 而苦苦挣扎。简而言之,如果选择了客户端证书,则无法以编程方式清除状态,除非在 IE 中使用 document.execCo
我的网站是在由 Apache 服务器提供服务的 Angular 上设置的。我通过 View 将内容动态加载到主页上。 现在以下是我的问题: 我建立这个网站的主要目的是通过 google adsense
我最近遇到了我的应用程序的问题,当它突然被 Google Play 拒绝时因为他们发现我使用的是背景位置 .但实际上我并没有使用这个功能。我只有 ACCESS_COARSE_LOCATION和 ACC
function sendPushNotification(subscription, urlEncodedData){ try { webpush.sendNotification(su
我包裹了一个 request-promise-native调用返回 promise 的函数。 import request from 'request-promise-native'; functio
我正在开发我的 meteor 项目,并开始设置我的第一个更复杂的允许/拒绝规则。我发现很难看出哪些允许触发,哪些不允许触发,以及这些函数中的某些变量包含什么。例如: List.allow({ u
我正在 AngularJS 中创建一个 Factory,它是这样的: if (href) { return $http({ method: method, url: item.href });
我是一名优秀的程序员,十分优秀!