我必须在我的C ++代码中定义一个全局数组,其大小必须从文件中读取。我使用以下代码
#include<iostream>
#include<string>
#include<fstream>
using namespace std;
string inputfile = "input.txt";
ifstream infile(inputfile.c_str());
infile>>N; // N = size of Array
int array[N];
// ------some code here-----
int main(){
int N;
cout << N<<endl;
return 0;
}
但如果我放置3行
string inputfile = "input.txt";
ifstream infile(inputfile.c_str());
infile>>N; // N = size of Array
在主循环内部,此代码可以正常工作。不幸的是我不能把它放在任何函数中,因为我需要从变量N初始化一个全局数组。
我问了很多人并搜索了不同的地方,但我似乎无法弄清楚这一点。谢谢你的帮助。
答案 0 :(得分:6)
数组的大小必须是常量表达式,即在编译时已知。
从文件中读取值是一种固有的动态操作,它在运行时发生。
一种选择是使用动态分配:
int array_size()
{
int n;
ifstream infile("input.txt");
if (infile>>n)
return n;
else
throw std::runtime_error("Cannot read size from file");
}
int* array = new int[array_size()];
但最好用std::vector<int>
替换可以动态调整大小的数组。
答案 1 :(得分:2)
使用全局指针。定义
int* array;
在主程序之前的全局空间中。然后,在循环或不循环中,说
array = new int[N];
分配你的数组。只记得也说
delete[] array;
退出main
或重新分配array
之前
答案 2 :(得分:1)
int array[N];
- N
应该在编译时知道
相反,请使用int array[]=new int[N]; /*some code using array*/ delete[] array;
int *array;
int main(){
ifstream infile("input.txt");
unsigned N;
infile>>N;
array=new int[N];
//using array...
delete[] array; //when no longer needed.
//don't use array after this line
//unless it's array=new int[] instruction
//or you know what you're doing.
}