我想在RAD studio 2010中从文件读取到unsigned char数组,我有一个例子,但我需要读取文件的数组大小。对不起我的英文
void __fastcall TForm1::ChooseFileClick(TObject *Sender)
{
TOpenDialog *od = new TOpenDialog(this);
if (od->Execute()) {
TFileStream *fs = new TFileStream(od->FileName,fmOpenRead);
fs->Position = soFromBeginning;
TMemo *m = new TMemo(this);
m->Parent = this;
m->Lines->LoadFromStream(fs);
delete fs;
fs = NULL;
}
delete od;
od = NULL;
}
答案 0 :(得分:0)
虽然我不确定你的确切意图,但我可以告诉你:不要使用原始阵列!
在C ++中,我们有vector
类型。向量与数组非常相似,但您可以继续向其中添加元素。如果它变满了,它就会变得更大。 (实际上,向量只是数组的包装器。当它被填满时,它会创建一个更大的数组,将元素复制到新数组,然后丢弃原始数组)。
使用vector
时,您的代码遵循以下风格:
#include <vector> // so we can actually use vectors
... // program code here
// here's a basic loop which fills a vectors with the numbers 1 to 99.
std::vector<unsigned char> myVec;
while( there_is_stuff_to_read )
{
myVec.push_back(get_next_element());
}
当然,循环将涉及您使用的任何文件读取类。关键是push_back
方法,它向向量添加元素。
如果你的代码的其他部分特别依赖于使用unsigned char数组,那么你可以填充向量,并根据需要使用这行代码:
unsigned char * arr = &myVec[0];
然后您可以使用arr
作为通常的unsigned char数组。只需确保在向量中添加更多元素后不要挂起此指针。它不能保证保持一个指向向量内部数组开头的有效指针(因为向量重新分配了它的内部数组)。
上一行代码不会创建一个全新的数组。如果您想要矢量内部内容的真实副本,可以使用以下内容:
unsigned char * arr = new unsigned char[myVec.size()];
std::copy(myVec.begin(), myVec.end(), arr);
请确保包含标准&lt; algorithm&gt;报头中。