如何使用新的 C++ 创建动态数组?
How to create a dynamic array using new C++?
我正在尝试动态初始化一个整数数组,因为数组的大小会根据输入而变化。
程序如下:
int main()
{
int* list = createList("dis.bin");
for (int i = 0; i < sizeof(list) / sizeof(int); i++)
{
printf("%d\n", list[i]);
}
}
用createList()
函数写成:
int* createList(const char* file_name)
{
int counter = 1;
int* inst{};
FILE* myFile = fopen(file_name, "rb");
if (myFile == nullptr)
{
printf("\nFile not opened\n");
return 0;
}
int x = 0;
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
inst = new int[counter];
inst[i] = x;
printf("%08x #%-4d | Int equiv: %-12d | Bin equiv: %s\n", x, counter, inst[i], ToBinary(inst[i], 0));
counter += 1;
x = 0;
}
return inst;
}
createList
从 .bin
文件(基本上包含一个字节数组)中读取并将每对 4 个字节插入数组 inst
中的一个项目。为此,我根据 counter
变量为数组分配新数量的 space。 (因此,无论值计数器是什么,都会成为 inst = new int[counter]
数组的大小)然后我将给定索引 i
处的数组内容设置为等于 x(读取的字节对)我会假设它至少在 createList
中工作正常,因为 printf
语句在 inst[]
.
中打印每个元素
然而,当我在 main 中调用 createList("dis.bin")
并将其分配给变量 int* list
时,我尝试遍历每个值。但这只是打印出一个未初始化的值(-842150451,如果您好奇的话)。所以我不确定我在这里做错了什么?
我应该提一下,我没有使用矢量或任何标准容器。我只是在使用数组。出于特定原因,我也在使用 printf
。
这里有两件事:
new
的用法被我误解了。无论出于何种原因,我认为每次为 inst
分配新内存时,它只是将新内存附加到已分配的内存中,但显然不是这样。如果我想模拟这个,我必须在每次迭代后复制数组的内容并将其添加到新分配的内存中。为了解决这个问题,我等到文件迭代完成后才为 inst
分配内存。
正如 Andy 所指出的,sizeof(list) / sizeof(int)
不会给我 list
中的元素数量,因为它是一个指针。为了解决这个问题,我为 createList()
函数创建了一个新参数 int &read
以传递创建的项目数。
有了这些要点,新函数看起来像这样并按预期工作:
int* createList(const char* file_name, int &read)
{
int counter = 1;
FILE* myFile = fopen(file_name, "rb");
if (myFile == nullptr)
{
printf("\nFile not opened\n");
return 0;
}
int x = 0;
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
printf("%08x #%-4d | Int equiv: %-12d | Bin equiv: %s\n", x, counter, x, ToBinary(x, 0));
counter += 1;
}
int* inst = new int[counter];
read = counter;
rewind(myFile); // rewind to beginning of file
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
inst[i] = x;
x = 0;
}
return inst;
}
main 也发生了一些变化:
int main()
{
int read;
int* list = createList("dis.bin", read);
for (int i = 0; i < read; i++)
{
printf("%d\n", list[i]);
}
}
至于!(feof(myFile))
无效的评论,虽然有帮助,但这不是我问题的一部分,因此我不关心。但为了传播重要信息,我将寻找解决方案: Why is "while ( !feof(file) )" always wrong?
这个问题被标记为 C++,但 OP 正在显示 C 代码并说他们需要在 C 中使用它,所以我将在 C 中显示它...但前提条件是它使用 new
而不是 malloc
int* createList(const char* file_name, int& count)
{
// initialize count, so that way if we return early, we don't have invalid information
count = 0;
// open the file ad "READ" and "BINARY"
FILE* myFile = fopen(file_name, "rb");
if (!myFile)
{
printf("\nFile not opened\n");
return 0;
}
// calculate how many 4-byte integers exist in the file using
// the file length
fseek(myFile, 0, SEEK_END);
count = ftell(myFile) / sizeof(int);
rewind(myFile);
// allocate the memory
int* returnData = new int[count];
// read in 4-byte chunks to our array until it can't read anymore
int i = 0;
while (fread(&returnData[i++], sizeof(int), 1, myFile) == 1);
// close the file
fclose(myFile);
// return our newly allocated data
return returnData;
}
int main()
{
int count;
int* myInts = createList("c:\users\andy\desktop\dis.bin", count);
for (int i = 0; i < count; ++i) {
printf("%d\n", myInts[i]);
}
// don't forget to delete your data. (another reason a vector would be better suited... no one remembers to delete :)
delete myInts;
}
我正在尝试动态初始化一个整数数组,因为数组的大小会根据输入而变化。 程序如下:
int main()
{
int* list = createList("dis.bin");
for (int i = 0; i < sizeof(list) / sizeof(int); i++)
{
printf("%d\n", list[i]);
}
}
用createList()
函数写成:
int* createList(const char* file_name)
{
int counter = 1;
int* inst{};
FILE* myFile = fopen(file_name, "rb");
if (myFile == nullptr)
{
printf("\nFile not opened\n");
return 0;
}
int x = 0;
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
inst = new int[counter];
inst[i] = x;
printf("%08x #%-4d | Int equiv: %-12d | Bin equiv: %s\n", x, counter, inst[i], ToBinary(inst[i], 0));
counter += 1;
x = 0;
}
return inst;
}
createList
从 .bin
文件(基本上包含一个字节数组)中读取并将每对 4 个字节插入数组 inst
中的一个项目。为此,我根据 counter
变量为数组分配新数量的 space。 (因此,无论值计数器是什么,都会成为 inst = new int[counter]
数组的大小)然后我将给定索引 i
处的数组内容设置为等于 x(读取的字节对)我会假设它至少在 createList
中工作正常,因为 printf
语句在 inst[]
.
然而,当我在 main 中调用 createList("dis.bin")
并将其分配给变量 int* list
时,我尝试遍历每个值。但这只是打印出一个未初始化的值(-842150451,如果您好奇的话)。所以我不确定我在这里做错了什么?
我应该提一下,我没有使用矢量或任何标准容器。我只是在使用数组。出于特定原因,我也在使用 printf
。
这里有两件事:
new
的用法被我误解了。无论出于何种原因,我认为每次为inst
分配新内存时,它只是将新内存附加到已分配的内存中,但显然不是这样。如果我想模拟这个,我必须在每次迭代后复制数组的内容并将其添加到新分配的内存中。为了解决这个问题,我等到文件迭代完成后才为inst
分配内存。正如 Andy 所指出的,
sizeof(list) / sizeof(int)
不会给我list
中的元素数量,因为它是一个指针。为了解决这个问题,我为createList()
函数创建了一个新参数int &read
以传递创建的项目数。
有了这些要点,新函数看起来像这样并按预期工作:
int* createList(const char* file_name, int &read)
{
int counter = 1;
FILE* myFile = fopen(file_name, "rb");
if (myFile == nullptr)
{
printf("\nFile not opened\n");
return 0;
}
int x = 0;
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
printf("%08x #%-4d | Int equiv: %-12d | Bin equiv: %s\n", x, counter, x, ToBinary(x, 0));
counter += 1;
}
int* inst = new int[counter];
read = counter;
rewind(myFile); // rewind to beginning of file
for (int i = 0; !(feof(myFile)); i++)
{
fread(&x, sizeof(int), 1, myFile);
inst[i] = x;
x = 0;
}
return inst;
}
main 也发生了一些变化:
int main()
{
int read;
int* list = createList("dis.bin", read);
for (int i = 0; i < read; i++)
{
printf("%d\n", list[i]);
}
}
至于!(feof(myFile))
无效的评论,虽然有帮助,但这不是我问题的一部分,因此我不关心。但为了传播重要信息,我将寻找解决方案: Why is "while ( !feof(file) )" always wrong?
这个问题被标记为 C++,但 OP 正在显示 C 代码并说他们需要在 C 中使用它,所以我将在 C 中显示它...但前提条件是它使用 new
而不是 malloc
int* createList(const char* file_name, int& count)
{
// initialize count, so that way if we return early, we don't have invalid information
count = 0;
// open the file ad "READ" and "BINARY"
FILE* myFile = fopen(file_name, "rb");
if (!myFile)
{
printf("\nFile not opened\n");
return 0;
}
// calculate how many 4-byte integers exist in the file using
// the file length
fseek(myFile, 0, SEEK_END);
count = ftell(myFile) / sizeof(int);
rewind(myFile);
// allocate the memory
int* returnData = new int[count];
// read in 4-byte chunks to our array until it can't read anymore
int i = 0;
while (fread(&returnData[i++], sizeof(int), 1, myFile) == 1);
// close the file
fclose(myFile);
// return our newly allocated data
return returnData;
}
int main()
{
int count;
int* myInts = createList("c:\users\andy\desktop\dis.bin", count);
for (int i = 0; i < count; ++i) {
printf("%d\n", myInts[i]);
}
// don't forget to delete your data. (another reason a vector would be better suited... no one remembers to delete :)
delete myInts;
}