0

我正在开发一个处理创建两个字符串、用户名和密码的项目。这两个元素构成了一个 Account 对象。大体上,有一个在 10 处初始化的帐户数组。我有一个 Save & Quit 选项,它将用户名保存在同一文件中的一行中,并将密码保存在下一行中。一对线表示另一个帐户。

我的问题是,您如何正确保存帐户数组中的数据,然后从以前的帐户数组中加载数据?

std::bad_alloc memory每次尝试该loadAccounts()功能时都会出错。我有几种不同的方法,但无济于事。

到目前为止,我已经想出了这个来保存数组(到目前为止应该可以工作):

void saveAccounts(Account accs [], int numIndexes)
{
std::ofstream savefile("savedata.sav", std::ofstream::binary); // By re-initializing the file, the old contents are overwritten.
for (int i = 0; i < numIndexes; i++)
{
    savefile << accs[i].getUsername() << endl;
    savefile << accs[i].getPassword() << endl;
}
savefile.close();
}

至于我的加载功能,我有:

Account* loadAccounts() // Load the data from the file to later print to make sure it works correctly.
{
cout << "LOADING ACCOUNTS!" << endl;
std::ifstream loadfile("savedata.sav", std::ifstream::binary);

Account * acc_arr; // The "Array" to be returned.
Account tmp_arr [10]; // The array to help the returned "Array."
acc_arr = tmp_arr; // Allowing the "Array" to be used and returned because of the actual array.
if (loadfile.is_open())
{
    int i = 0;
    while (loadfile.good())
    {
        cout << "Loadfile is good and creating Account " << i+1 << "." << endl; // For my own benefit to make sure the data being read is good and actually entering the loop.
        std::string user;
        std::getline(loadfile, user);
        std::string pass;
        std::getline(loadfile, pass);
        Account tmpAcc(user, pass);
        tmp_arr[i] = tmpAcc;
        ++i;
    }
    Account endAcc = Account(); // The default constructor sets Username to "NULL."
    tmp_arr[i] = endAcc;
}
loadfile.close();
cout << "ACCOUNTS LOADED SUCCESSFUL!" << endl;
return acc_arr;
}

我已经收集到我可以通过使用指针和实际数组来返回一个数组来做同样的事情,因为实际上不能返回一个数组。

我尝试在这里使用返回的数组,我试图将加载的数组“复制”到实际打印的数组中。稍后,我将打印数组(acc_arr)以确保加载的数组已成功加载:

else if (selection == 'l' || selection == 'L')
{
Account * tmp_acc_arr = new Account [10];
    tmp_acc_arr = loadAccounts();
    _getch();
    for (size_t i = 0; i < size_t(10); i++)
    {
        if (tmp_acc_arr[i].getUsername() == "NULL")
        {
            break;
        }
        acc_arr[i] = tmp_acc_arr[i];
        cout << "Added Account " << i << " succesfully." << endl;
    }
}

该错误是由最后一段代码引起的。我已经检查以确保使用正确复制的数据

编辑:尴尬...通过使用 if 语句来确保其中的数据在tmp_acc_arr返回并在主中初始化后实际存储了数据。

4

2 回答 2

0

tmp_arrist local 在堆栈中loadAccounts和堆栈上。loadAccounts()退货后即失效。您的返回值是无效的堆栈指针。

您可以将指向tmp_acc_arr函数的指针作为参数传递,并用文件中的值填充它。您还应该检查溢出或更好地使用像 std::vector 这样的 STL 容器。

编辑


void loadAccounts(Account * acc_memory, std::allocator<Account> alloc, size_t acc_array_size) // Load the data from the file to later print to make sure it works correctly.
{
  Account *end_of_construction = acc_memory;
  try
  {
    cout << "LOADING ACCOUNTS!" << endl;
    std::ifstream loadfile("savedata.sav", std::ifstream::binary);
    if (loadfile.is_open() && loadfile.good())
    {
        size_t i = 0;
        for (size_t i=0; i<acc_array_size; ++i)
        {
          if (loadfile.good())
          {
            cout << "Loadfile is good and creating Account " << i+1 << "." << endl; // For my own benefit to make sure the data being read is good and actually entering the loop.
            std::string user, pass;
            std::getline(loadfile, user);
            if (loadfile.good())
            {
              std::getline(loadfile, pass);
              alloc.construct(end_of_construction++, user, pass);
            }
            else alloc.construct(end_of_construction++);
          }
          else alloc.construct(end_of_construction++);
        }
    }
    loadfile.close();
    cout << "ACCOUNTS LOADED SUCCESSFUL!" << endl;
  }
  catch (...)
  {
    size_t num_constructed = end_of_construction-acc_memory;
    for (size_t i=0; i<num_constructed; ++i) alloc.destroy(acc_memory + i);
    throw;
  }
}

像这样使用

  size_t const num_elements = 10;
  std::allocator<Account> acc_alloc;
  Account * tmp_acc_arr = acc_alloc.allocate(num_elements);
  loadAccounts(tmp_acc_arr, acc_alloc, num_elements);
  // do stuff
  for (size_t i=0; i<num_elements; ++i) acc_alloc.destroy(tmp_acc_arr + i);
  acc_alloc.deallocate(tmp_acc_arr, num_elements);
于 2013-06-16T23:20:05.033 回答
0

您返回一个指向数组的指针,该数组在您退出函数后立即被销毁。使用该指针会导致未定义的行为,即 BAD。

正如您所观察到的,数组不是有效的返回类型,因此要实际返回它,您应该将它放在一个结构中,然后返回该结构。

于 2013-06-16T23:20:11.207 回答