c++ - 在 C++ 中将格式化的数值数据读取到数组

标签 c++ arrays input

我正在使用 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 的使用对于第二个“维度”。当维度的大小在编译时已知时,此选项在内存大小和缓存友好性方面都更经济。

Demo.

关于c++ - 在 C++ 中将格式化的数值数据读取到数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34135035/

相关文章:

C++ stoi 超出范围问题

c - 将整个结构数组传递给 C 中的 Pthread_Create

c++ - 指针基本 : A simple query

php - 数组foreach修改

python - 查找一个数组中的相同值以及另一个数组中的等价对

html - 为 Mobile Safari (webkit) 重新创建 HTML5 范围输入?

html - 如何允许用户在输入中键入上标?

css - 使用单选输入使 div 通过 CSS 可见

c++ - uBLAS 矩阵清除内存

c++ - 仅在 CUDA 上修改设备内存一次