2014-02-22 79 views
0

的矢量的文本文件的數據類型作爲結構和存儲數據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; 
} 
+0

我會用'std :: vector >'爲此,如果每行項目的順序不是強制性的。如果需要排序,我會使用'std :: vector >'。如果需要原始*精確*順序,則使用'std :: vector >>'或類似的結構。前兩個維護'int'作爲索引,這有其好處。 – WhozCraig

回答

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"; 
     } 
    } 
} 
+1

謝謝,當你說「有更好的方法來做到這一點」,你的意思是更有效率嗎?如果是的話你可以告訴什麼是最好的方式,因爲我有非常大的文件,並且在處理之前我想以格式保存數據文件(將每行存儲在容器中,例如列表中的第一行,第二行中的第二行列表等) – Sandy