我正在尝试使用for循环打印表示Graph节点和边缘权重的矩阵。第一个之后的所有行按预期工作,但是列的节点名称的打印表现得非常奇怪,在尝试多种不同的方法后我完全丢失了。这是'有问题的'代码和输出。
代码:
void Graph::print_graph_matrix(void)
{
std::cout << "\n";
int i, j;
for(i = 0; i < nodes.size(); i++)
{
std::cout << "\t" << nodes[i];
}
std::cout << "\n";
for(i = 0; i < nodes.size(); i++)
{
std::cout << nodes[i];
for(j = 0; j < nodes.size(); j++)
{
std::cout << "\t" << edges[i][j];
}
std::cout << "\n";
}
}
输出:
D
A 0 0 0 0
B 0 0 0 0
C 0 0 0 0
D 0 0 0 0
但是顶部列标签应该打印
A B C D
当我尝试在代码中调试它时(通过打印i本身的值),我第一次打印出来时打印出来的是3,而不是0,我的目标起始索引。
我从未见过这样的事情,请帮助我了解这里发生了什么。谢谢!
编辑: 我的代码的其他部分正在被要求,因为这可能发生在其他地方。
主:
int main()
{
clear_screen();
int graph_num;
std::string filename;
std::cout << "How many graphs would you like to create?\n";
std::cin >> graph_num;
std::cin.ignore();
std::fstream files[graph_num];
Graph * graphs[graph_num];
for(int k = 0; k < graph_num; k++)
{
graphs[k] = new Graph();
std::cout << "\nEnter the name of file " << k+1 << " to read: ";
std::cin >> filename;
std::cin.ignore();
files[k].open(filename.c_str());
if(files[k].fail())
{
std::cout << "\nError opening file '" << filename << "'...\n";
return -1;
}
else
{
std::cout << "\nSuccess opening '" << filename << "'!\nSetting graph...\n";
graphs[k]->set_graph(files[k]);
graphs[k]->print_graph_matrix();
}
}
for(int j = 0; j < graph_num; j++)
{
files[j].close();
}
}
set_graph函数:
void Graph::set_graph(std::fstream &fin)
{
std::string line;
std::vector<int> row;
while(getline(fin, line))
{
if(isBlank_str(line))
{
std::cout << "Nodes read in successfully!\n";
break;
}
else
{
nodes.push_back(line);
node_num++;
}
}
while(getline(fin, line))
{
//set edges here
edge_num++;
if(fin.eof())
break;
}
//initialize an empty row
for(int i = 0; i < node_num; i++)
{
row.push_back(0);
}
//push back empty rows
for(int j = 0; j < node_num; j++)
{
edges.push_back(row);
}
}
示例数据文件(由教授提供):
A
B
C
D
A B 3
A C 10
A D 12
B C 1
B D 14
C D 4
我知道这段代码有些草率,因为它只是我项目的开始,但我总是倾向于遇到我遇到的每一个错误,直到我能解决它。我从未见过这样的事情,所以我很感激你们的时间和帮助!
答案 0 :(得分:1)
@牛米。建议我检查&#39; \ r&#39;输入数据文件中的字符,正如他所预测的那样,确实有这些字符位于我的向量中的字符串中,这导致了终端的错误,覆盖输出。
为了解决这个问题,我添加了一行:
line.erase(line.size() - 1);
然后它完美无缺!
答案 1 :(得分:0)
我在上面重新创建了一个简单的程序示例,例如:
#include <vector>
#include <iostream>
#include <iomanip>
class Graph {
public:
std::vector<char> nodes { 'A', 'B', 'C', 'D' };
unsigned edges[4][4] { { 00, 01, 02, 03 },
{ 10, 11, 12, 13 },
{ 20, 21, 22, 23 },
{ 30, 31, 32, 33 } };
void print_graph();
};
void Graph::print_graph() {
std::cout << "\n";
unsigned i, j;
for ( i = 0; i < nodes.size(); i++ ) {
std::cout << "\t" << std::setw(2) << nodes[i];
}
std::cout << "\n";
for ( i = 0; i < nodes.size(); i++ ) {
std::cout << nodes[i];
for ( j = 0; j < nodes.size(); j++ ) {
std::cout << "\t" << std::setfill( '0' ) << std::setw(2) << edges[i][j];
}
std::cout << "\n";
}
}
int main() {
Graph g;
g.print_graph();
return 0;
}
我得到以下输出到控制台:
A B C D
A 00 01 02 03
B 10 11 12 13
C 20 21 22 23
D 30 31 32 33
从你所提供的代码我所知道的;应该没有错误。这个错误很可能来自你所展示的之外的某个地方。我输出显示的唯一区别是我使用了std::setw()
&amp; std::setfill()
用于与控制台对齐。
答案 2 :(得分:0)
没有提到的罪魁祸首:
j < nodes.size()
应该是
j < edges[i].size()