【问题标题】:String in binary files, struct?二进制文件中的字符串,结构?
【发布时间】:2015-12-01 03:36:21
【问题描述】:
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

struct client {
public:
char name[10];
  int balance;
  char id[5];

};

int main()
{
  int ans;
 int x;
 string nameIn;
 string adjName;

 ofstream out("client1.dat", ios::binary);

 cout << "\nDo you want to add information or update info" << endl;
 cin >> ans;
 if (ans == 1)
 {
    cout << "\nPlease enter the name of your client" << endl;
    cin >> nameIn;

  while (nameIn.length() <=10)
  {
      for (int i=0; i < 10; i++)
      {
         adjName[i] = nameIn[i];
     }
 }
 while (10-adjName.length()>0)
{
    int x = 10 - adjName.length();

    for (x; x< 10; x++)
    {
        adjName[x] = ' ';
    }
}
 for (int i = 0; i < adjName.length(); i++)
{
    client name = adjName[i];
}

但这部分一直显示为错误

 for (int i = 0; i < adjName.length(); i++)
   {
    client name = adjName[i];

我试图让用户写一个名字,如果它超过 10 个字母,它会切断它,或者更短它会添加空格。 也有人可以解释一下为什么不能将字符串写入二进制文件吗? 如果我使用字符串,为什么我必须使用结构而不是类。

【问题讨论】:

  • 尽量准确地指出错误在哪里以及错误是什么。这也可能是无限循环:while (nameIn.length()
  • 客户名称 = adjName[i];对于这一行,它说 - 不存在合适的构造函数来从 char 转换为“client”
  • @JackFaber 也有人能解释一下为什么你不能将字符串写入二进制文件吗? -- 检查你在尝试写入字符串时创建的文件。你看到你的字符串在那乱七八糟的数据中了吗?那就是通过检查的证据。您不能将您在文件中看到的垃圾转回原始字符串。所以真正要问的问题是“我保存了什么?”
  • 仅供参考:SO 的工作方式您需要发布 2 个问题:一个关于超过 10 个字符的问题,另一个关于如何将字符串写入二进制文件。一旦有人解决了第一个问题,请务必接受他们的答案并单独提出下一个问题。
  • 您可以使用调试器吗?如果没有,就买一个。一旦您可以逐行浏览并查看发生了什么,您的理解将增加 10 倍。

标签: c++ struct binaryfiles


【解决方案1】:

首先,您的代码中有一个错字:client name = adjName[i]; 没有意义。你忘了点吗?

第二个(也是最重要的)您在 C++ 代码中使用 C 字符指针。除非您必须这样做,否则您不应该这样做——而且现在没有必要。您的代码应如下所示:

struct client {
   std::string name;
};

// read the data
name = nameIn.substr(0, 10);

【讨论】:

  • "写一个名字,如果它超过 10 个字母,它将切断它" 至少需要一个 char name[11]; 数组来包含终止 @987654325 @ 特点。而且我已经在他们之前的问题中尝试过处理该用户。他们很难理解我们试图告诉他们什么。实际上我一直在放弃,并且看不到未来研究的任何价值。
  • “除非你必须这样做,否则你不应该这样做” 看看他们的 previous question 以及我为什么建议这样做。在这种情况下,它可能是有意义的并且是完全有效的。
  • @πάνταῥεῖ,序列化,嗯?好吧,虽然我不喜欢序列化时的身份编码。
  • 他们最初一直在要求二进制文件。我也不喜欢那个,只是想向你指出整体背景,因为我已经去过那里了。我没有说你的答案是错误的。
  • @πάνταῥεῖ,谢谢 - 我喜欢了解上下文,至少我知道发生了什么。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 2011-02-28
  • 2016-08-30
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2015-07-02
相关资源
最近更新 更多