我正在尝试从文件中读取并将每个新行/条目放入数组中。但是,我更主要熟悉C#而C ++不是我的事。我需要这样做的原因是一个项目,我是唯一愿意做这个部分的人。
我不知道如何正确转换字符类型或者是否可能。我试过在互联网上搜索,但没有找到任何关于我的问题的答案。另外,因为我不知道是什么导致了非法的操作数,我不知道这里有什么问题。
#include "..\STDInclude.h"
// TODO: Fill that list with names
char* Bots::NameList[] = {};
void Bots::GetNames()
{
using namespace std;
ifstream file("bot_names.txt");
if (file.is_open())
{
for (int i = 0; i < 48; i++)
{
file >> Bots::NameList[i];
}
}
}
void Bots::Initialize()
{
// Replace staff array with custom one
*(char***)Addresses::BotArray1 = Bots::NameList;
*(char***)Addresses::BotArray2 = Bots::NameList;
*(char***)Addresses::BotArray3 = Bots::NameList;
// Apply new array size
int size = (sizeof(Bots::NameList) / sizeof(Bots::NameList[0]));
*(BYTE*)Addresses::BotArraySize1 = size;
*(BYTE*)Addresses::BotArraySize2 = size;
*(BYTE*)Addresses::BotArraySize3 = size;
*(BYTE*)Addresses::BotArraySize4 = size;
}
答案 0 :(得分:3)
C ++中的数组具有固定的大小。所以当你写char* Bots::NameList[] = {}
时,你有一个空数组的c字符串(又名char*
)。
更糟糕的是,当您稍后编写file >> Bots::NameList[i];
时,您正在将未终止的c-strings写入未初始化的指针,这将导致内存损坏。
除非进行基本的重写,否则这段代码注定要失败。我强烈建议您将char*
替换为std::string
,并将固定大小的数组切换为向量。
std::vector<std::string> Bots::NameList;
void Bots::GetNames()
{
...
for (int i = 0; i < 48; i++)
{
string s; // space separated strings ? sure ?
file >> s; // or getline(file, s) if you want lines
NameList.push_back(s);
}
}
}
有条件的评论:
我无法确定,因为我不知道Addresses
成员的定义,但以下陈述相对可疑:
*(char***)Addresses::BotArray1 = Bots::NameList;
它表明Addresses::BotArray1
是一个数组或一个指针。但是您使用(char***)
进行投射的事实表明您尝试修复类型不匹配。只有当BotArray
指向已存储char**
地址的有效NameList
指针时,取消引用已转换指针才有意义。
答案 1 :(得分:2)
在C ++中,数组必须在创建时调整大小,然后才能修复,因此char* Bots::NameList[] = {};
是一个零元素数组,并且就是这样。更糟糕的是,在file >> Bots::NameList[i]
没有为Bots :: NameList [i]分配存储空间,所以你的程序正在写入未初始化的内存。可能是BOOM等待发生。我将提出一些完全不同的建议。
:
std::vector<std::string> NameList;
然后......
void Bots::GetNames()
{
std::ifstream file("bot_names.txt");
if (file.is_open())
{
for (int i = 0; i < 48; i++)
{
std::string temp;
file >> temp;
NameList.push_back(temp);
}
}
}
Addresses::BotArray1..N
也必须变为std::vector
并且Addresses::BotArraySize1..N
变得多余,因为矢量知道它们的大小。