使用现代c ++从文件中读取 - 不存储数据

时间:2017-04-29 07:43:22

标签: c++11 templates

也许我对shared_poin有点不对,或者我的一些基本缺点但我无法做到这一点。所以我想从文件中读取一些数据。数据文件的每一行都有位置和动量数据,第一行存储数据点的数量。

我需要将此内容读入我的数据结构中,由于某些原因,我的图表无法填充,尽管数据正确读入。

const int dim = 3; // dimension of problem

template <typename T, typename G>
// T is the type of the inputted locations and G is the type of the 
// distance between them
// for example: int point with float/double distance
struct Node{

    std::pair< std::array<T, dim>,std::pair< std::array<T, dim>, G > > pos; // position
    std::pair< std::array<T, dim>,std::pair< std::array<T, dim>, G > > mom; // momentum
    // a pair indexed by a position in space and has a pair of position
    // and the distance between these points

};

template <typename T, typename G>
struct Graph{

    int numOfNodes;
    std::vector< Node<T,G> > nodes;

};

这是数据结构,这里是我的读函数(std::cout - s仅用于测试):

template <typename T, typename G>
std::istream& operator>>(std::istream& is, std::shared_ptr< Graph<T,G> >& graph){

    is >> graph->numOfNodes; // there's the number of nodes on the first line of the data file
    std::cout << graph->numOfNodes << "\n";

    for(int k=0; k<graph->numOfNodes; k++){

        Node<T,G> temp;

        for(auto i : temp.pos.first){
            is >> i;
            std::cout << i << "\t";
        }

        std::cout << "\t";

        for(auto i : temp.mom.first){
            is >> i;
            std::cout << i << "\t";
        }

        std::cout << "\n";

        graph->nodes.push_back(temp);

    }

    return is;

 }

我也有输出功能。因此,如果我输出在读入期间我打算填充的图形被清零。 os节点的数量是正确的,但是位置和momente都被清零。我做错了什么?提前致谢。

1 个答案:

答案 0 :(得分:1)

for(auto i : temp.pos.first){
    is >> i;
    std::cout << i << "\t";
}

将此视为与功能类似。如果你有类似的东西:

void doX(int i) { i = 42; }
int main() {
    int j=5;
    doX(j);
    return j;
}

运行此代码,您将看到程序返回值5.这是因为函数doX按值i获取;它基本上需要变量的副本。

如果用

替换doX的签名
void doX(int &i)

并运行代码,你会看到它返回42.这是因为函数现在通过引用获取参数,因此可以修改它。

你的循环行为类似。正如您现在所拥有的那样,它们依次获取数组中值的副本,但不是参考。

与该功能一样,您可以将循环更改为

for(auto &i : temp.pos.first){
    is >> i;
    std::cout << i << "\t";
}

然后,您可以更改存储在数组中的值。