我需要能够根据文件中的字节数设置数组的大小。
例如,我想这样做:
// Obtain the file size.
fseek (fp, 0, SEEK_END);
size_t file_size = ftell(fp);
rewind(fp);
// Create the buffer to hold the file contents.
char buff[file_size];
但是,我得到一个编译时错误,说缓冲区的大小必须是常量。
我该如何做到这一点?
答案 0 :(得分:10)
使用矢量。
std::vector<char> buff(file_size);
整个矢量首先自动填充'\ 0'。但是“失去”的表现可能并不明显。它当然更安全,更舒适。然后像通常的数组一样访问它。您甚至可以将指向数据的指针传递给传统C函数
legacy(&buff[0]); // valid!
答案 1 :(得分:2)
您应该使用std::vector而不是数组。
真实数组要求您指定它们的大小,以便编译器可以为它们创建一些空间 - 这就是当您不提供常量整数时编译器会抱怨的原因。动态数组由指向数组基础的指针表示 - 您必须自己检索动态数组的内存。然后,您可以使用带有下标表示法的指针。如,
int * x;
x = (int *) malloc( sizeof(int) *
getAmountOfArrayElements() /* non-const result*/
);
x[5] = 10;
这会导致两类问题:
缓冲区上/下流:您可能会在数组的任一端下标索引。
您可能忘记释放内存。
Vector提供了一个很好的小界面来隐藏这些问题 - 如果使用得当的话。
答案 2 :(得分:1)
替换
char buff[file_size];
与
char *buff = new char[file_size];
一旦使用了buff,你就可以使用以下内容释放内存:
delete[] buff;
答案 3 :(得分:1)
我想提出的问题有两点。
您的错误讯息。声明某种类型的数组时,必须使用常量大小声明它。例如,
const int FileSize = 1000;
// stuff
char buffer [FileSize];
完全合法。
另一方面,你所做的,试图声明一个大小可变的数组,然后不用 new 分配,会产生错误。
答案 4 :(得分:-3)
问题是需要在堆上创建buff(而不是堆栈)。编译器希望知道在堆栈上创建的确切大小。
char* buff = new char[file_size];