C ++从文本文件数据类型读取结构并将数据存储在列表向量中

时间:2014-02-22 03:22:01

标签: c++

我在文本文件中有大量数据:

1 0.933 2 0.865 3 0.919 4 0.726 
2 0.854 3 0.906 4 0.726 
2 0.882 5 0.853 4 0.897
.
. etc

每个整数都跟随其浮点值。我想逐行阅读这个文件,并将每一行存储在列表中。我知道如何使用链表列表来做到这一点,但是,我无法修复内存泄漏。我读到最好使用STL代替。 示例

    list 1=  1 0.933 2 0.865 3 0.919 4 0.726 
    list 2=  2 0.854 3 0.906 4 0.726 
    list 3=  2 0.882 5 0.853 4 0.897
.
.

我不确定(列表的向量)是否与(链表的数组)类似。我尝试了不同的方法,但我的所有尝试都失败了。

#include "stdafx.h"
#include <vector>
#include <list>
#include <iostream>
#include <map>
#include <sstream>
#include <iterator>
#include <fstream>

struct MyData{
    int Item;
    float Prob;
};
std::istream& operator>>(std::istream &is, MyData&d)
{
    return is >> d.Item >> d.Prob;
}


int main()
{

    std::ifstream in("DataF.txt");
    std::string line;
    int i = 0;
    while (std::getline(in, line)) {
            typedef std::istream_iterator<MyData> MyDataIstrIt;
            std::stringstream ss(line);             
        std::vector< std::list< MyData> >  data3{ MyDataIstrIt(ss), MyDataIstrIt() }; //  here I couldn't fix the  extractor definition for the vectors of lists

// another attempt
/*std::vector<MyData> data{ MyDataIstrIt(ss), MyDataIstrIt() };
  std::vector< std::list< MyData> > data2;
  data2.push_back(std::vector<MyData>()); // I read this is important for memory leak
  data2.push_back(data);*/
 // data2[i].push_back(data);
 // ++i;



    }
    system("PAUSE");
    return 0;
}

1 个答案:

答案 0 :(得分:3)

有更好的方法可以做到这一点,但为了向您展示如何使用列表或读入一个列表然后将其放入向量中..

#include <vector>
#include <list>
#include <iostream>
#include <map>
#include <sstream>
#include <iterator>
#include <fstream>

struct MyData
{
    int Item;
    float Prob;
};

std::istream& operator>>(std::istream &is, MyData&d)
{
    return is >> d.Item >> d.Prob;
}

int main()
{
    std::string line;
    std::vector<std::list<MyData>> data;

    std::ifstream in("DataF.txt"); //don't forget to check `if (in.is_open())`

    while(std::getline(in, line))
    {
        std::stringstream ss(line);
        std::list<MyData> inner;
        MyData info;

        while(ss >> info)
        {
            inner.push_back(info);
        }

        data.push_back(inner);
    }

    for (auto &list : data)
    {
        for (auto &mdata : list)
        {
            std::cout<<mdata.Item<<"   "<<mdata.Prob<<"\n";
        }
    }
}