用C++将格式化的数值数据读取到数组中

Reading formatted numerical data to an array in C++

本文关键字:读取 数组 数值数据 C++ 格式化      更新时间:2023-10-16

我正在使用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];
    }
    }
}

这是惯用语吗?查看其他堆栈溢出的答案,大多数似乎使用"getline"和其他字符串处理函数,但这对我来说似乎过于复杂

首先,在C++中使用可变长度数组是一种扩展,而不是标准特性。当在编译时不知道条目数时,使用std::vector可以提供更好的可移植性。

如果每行的原子数是固定的并且很小,则更习惯于"展开"内部循环,即写入

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。当在编译时已知维度的大小时,无论是在内存大小还是缓存友好性方面,此选项都更经济。

演示。