逐行读取文本文件(带整数)并将每行存储为向量(C ++)

时间:2016-07-23 00:33:59

标签: c++ text

我正在研究图论问题并使用邻接列表实现。我有很长的文本文件,它们代表N> 100个顶点的图形的邻接列表。

文本文件以下列方式编写:

1 2 3

2 3 1

3 2

这将代表三个顶点的图形。第一个数字是顶点,该行中的其余数字代表相邻的顶点。

我目前已将邻接列表声明为

vector<vector<int> > adjList(N);

我的目标是将每一行复制到adjList的每个元素中。

之前我使用ifstream读过文件,但这些文件只是将大量数据集复制到数组中,我觉得这个问题不同。

我该怎么做?

我目前的代码如下:

ifstream inFile;
int N=200;
vector<vector<int> > adj(N);

inFile.open("/Users/davidvillarreal/Desktop/aaa.txt");
cout << "opened " << endl;
if (inFile.fail()) {
    cerr << "error encountered" << endl;
    exit(1);
}

3 个答案:

答案 0 :(得分:1)

你可以简单地这样做..如果文件格式严格是一个空格和一个整数......并且在最后的新行...

vector<int> v;
vector<vector<int>> vv;
int i;
char c = ' ' ;
//repeat next until the eof
while(c != '\n') {
    f >> skipws >> i;
    v.push_back(i);
    f >> noskipws >> c;
}
vv.push_back(v);

答案 1 :(得分:1)

这个小例子应该表明这样做的一种方式:

#include <vector>
#include <sstream>
#include <iostream>
#include <string>
#include <iterator>
//...
int main()
{
    // use a typedef to simplify things a bit 
    typedef std::vector<int> Int1D;
    typedef std::vector<Int1D> Int2D;

    // declare the adjacency list
    Int2D adjList;

    std::string line;
    std::ifstream infile;
    //...
    //..assume that infile has been opened successfully
    //...
    while (std::getline(infile, line))
    {
       // use a string stream to help parse the ints
       std::istringstream strm(line);
       int n;

       // add an empty row
       adjList.push_back(Int1D());

       // now fill in the last row we added by reading in the ints
       while (strm >> n)
          adjList.back().push_back(n);
    }

    // output results
    for (size_t i = 0; i < adjList.size(); ++i)
    {
       std::copy(adjList[i].begin(), adjList[i].end(), std::ostream_iterator<int>(std::cout, " "));
       std::cout << '\n';
    }
}

Live Example

请注意,我们有两个循环 - “读取”循环,以及将每个int添加到adjList的最后添加向量的循环。 vector::back()的使用为我们提供了添加到列表中的最后一个向量。

答案 2 :(得分:1)

又一个解决方案:

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

int main() {

   std::vector< std::vector<int> > data;
   std::ifstream file("data.txt");
   std::string line;

   if ( file ) {
       while(std::getline(file, line)) {
          std::stringstream sline(line);
          data.push_back(std::vector<int>( std::istream_iterator<int>( sline ), std::istream_iterator<int>() ));
      }
   }

   return 0;
}