从C ++中的文本文件中读取有向图的邻接列表

时间:2014-03-21 14:58:01

标签: c++ file-io graph directed-graph adjacency-list

我有一个文本文件,每行有一些整数。例如:

1 2 4
3 
0 4

2 3

此处第1行表示第1个节点连接到编号为1,2和5的节点。空白行表示第4个节点未连接到任何节点。

这给了我一个有向图。 This SO question可能有用,但它假设每行有2个整数,而在这种情况下,它可以有0到N-1之间的任意数量的整数(N是节点数)。

我只想知道如何阅读此文本文件。如果我每行有两个整数,我可以做infile>> a>>湾如何知道" \ n"或者行尾已经发生。 我要求提供制作有向图的代码。

3 个答案:

答案 0 :(得分:1)

来自linked question的已接受答案已经向您展示了如何逐行阅读,您需要为您的代码执行此操作,第一部分显示了如何读取行中所有数字的循环(istringstream)。因为您没有固定数量的条目,所以您可能希望将它们存储在std :: vector中。

答案 1 :(得分:1)

我不认为这是作业,因为实际的主题是有向图。

因此有些代码。但是,你必须自己做错误处理。

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

typedef std::vector<int> nl_t;
typedef std::vector<nl_t> nll_t;

int main()
{
    std::ifstream is("test.dat");
    std::string str;

    nll_t nll;

    while(std::getline(is,str)) {
        std::istringstream ss(str);
        nl_t nl;
        int i;

        while(ss >> i) {
            nl.push_back(i);
        }
        nll.push_back(nl);
    }
}
/**
     Local Variables:
     compile-command: "g++ -g test.cc -o test.exe; ./test.exe"
     End:
*/

答案 2 :(得分:0)

关注此链接 http://www.c-plusplus.de/forum/p1940874#1940874。 阅读代码就足够了。没有必要理解德语文本。

在您的情况下您必须将主程序的第18行从while( datei >> ws )更改为while( datei )并删除第23和24行。因为在您的情况下,空行是一个信息。< / p>

或者你的主要看起来像这样:

ifstream file("input.txt");
if( !file.is_open() )
{
    cerr << ">Error by opening the file\n";
    return -2;
}
for( int node1 = 1; file.good(); ++node1 )
{
    for( int node2; !is_endl(file) && file >> node2; )
        cout << "Node " << node1 << " is connected with " << node2 << endl;
}