我正在使用C ++。我有一个数据文件,看起来像几千行,其中第一个数字是行数。
1238
0.37 0.29 -1.00
1.34 -2.95 3.40
4.59 2.21 1.29
我想把它读成二维数组。
我的代码有效:
int main(){
ifstream source("atoms.xyz");
int N;
source >> N;
double atoms[N][3];
int i = 0;
for (;i < N; i++){
int j = 0;
for (;j < 3; j ++){
source >> atoms[i][j];
}
}
}
这是惯用的吗?查看其他堆栈溢出答案大多数似乎使用&#34; getline&#34;和其他字符串处理函数,但这似乎过于复杂。
答案 0 :(得分:3)
首先,在C ++中使用可变长度数组是扩展,而不是标准功能。如果在编译时未知条目数,则使用std::vector
可提供更好的可移植性。
如果每条线的原子数是固定的并且很小,则更为惯用的是#34;展开&#34;内循环,即写
source >> atoms[i][0] >> atoms[i][1] >> atoms[i][2];
而不是
for (;j < 3; j ++){
source >> atoms[i][j];
以下是使用std::vector<T>
和展开循环重写此方法的一种方法:
int n;
cin >> n;
vector<array<double,3>> atoms;
for (int i = 0 ; i != n ; i++) {
array<double,3> data;
cin >> data[0] >> data[1] >> data[2];
atoms.push_back(data);
}
请注意std::array
用于第二个&#34;尺寸&#34;。当在编译时知道维度的大小时,就存储器大小和缓存友好性而言,此选项更经济。