从输入文件打印图表

时间:2017-03-28 06:37:11

标签: c++ stl

int main()
{

char line[100];
int N = 5;
vector<int>adj[N];
FILE *in = fopen("test.txt", "r");

for (int i = 1; i <= N; i++)
{
    fgets(line, 100, in);

    char *pch = strtok(line, "\t \n");
    int u = atoi(pch);

    pch = strtok(NULL, "\t \n");
    while (pch != NULL)
    {
        int v = atoi(pch);
        adj[u].push_back(v);
        pch = strtok(NULL, "\t \n");
    }

}
    for( int i = 0 ; i < 5; i++ )   // Printing graph
    {
       for( int p = 0 ; p < adj[i].size(); p++ )
       {
            cout<< i << " , "<< adj[i][p]<<endl;
        }
    }

这里&#34; test.txt&#34;文件包含这样的数据

1 2 3
2 1 4 5
3 1
4 2 
5 2

第一列包含顶点(1 - 5)

1 2 3     

上一行(第一行)表示Node 1已连接到Node 2Node 3

2 1 4 5     

上一行(第二行)表示Node 2已连接到Node 1Node 4Node 5

我想将此数据作为图表阅读。然后需要打印图表 我期待输出为

1,2   
1,3   
2,1   
2,4   
2,5    
3,1   
4,2    
5,2     // not getting in output

但我没有在输出中获得节点5。我尝试了一些其他数据,但仍然是输出中无法看到的最后一个节点 如果有人帮助我,那将是伟大的。

3 个答案:

答案 0 :(得分:2)

 vector<int>adj[N+1]; //change this line also
 for( int i = 1 ; i <= 5; i++ )   // Printing graph

更改此行。

答案 1 :(得分:2)

该行

adj[u].push_back(v);
u为5时,

使用越界索引访问内存。这是未定义行为的原因。它必须是:

adj[u-1].push_back(v);

当行中的数字后面有空格字符时,代码也会出现解析错误。您可以使用strtok来避免使用std::istringstream解析一行的陷阱。这是我的建议:

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

using namespace std;

int main()
{
   const int N = 5;
   vector<int> adj[N];

   std::ifstream infile("socc.in");
   std::string line;

   int i = 0;
   while ( i < N && getline(infile, line) )
   {
      std::istringstream str(line);
      int u;

      str >> u;
      if ( u > N )
      {
         // Problem.
         abort();
      }

      int v;
      while ( str >> v )
      {
         adj[u-1].push_back(v);
      }
      ++i;
   }

   for( int i = 0 ; i < N; i++ )   // Printing graph
   {
      for( size_t p = 0 ; p < adj[i].size(); p++ )
      {
         cout<< i << " , "<< adj[i][p]<<endl;
      }
   }
}

答案 2 :(得分:1)

R Sahu有正确答案,你有一个一个错误。

我想补充一点,你应该使用c ++功能来避免这种错误。 因此,将vector<int> adj[N];替换为vector<vector<int>> adj;array<vector<int>>

然后你可以使用at来访问你的数据(通过ref)并捕获一个很好的运行时错误来检测你的缺陷。