【问题标题】:c++ Reading from file to construct a pointer based mazec ++从文件中读取以构建基于指针的迷宫
【发布时间】:2014-11-29 08:05:59
【问题描述】:

我正在尝试阅读“基于指针”的迷宫。每行的第一个字母对应房间的字母……然后后面的字母分别是北节点、东节点、南节点和西节点。星号表示空房间或无效选项。

所以这将是一个示例输入:

A E B * *
B * * * A
C G D * *
D * * * C
E I F A *
F J G * E
G K H C F
H L * * G
I * J E *
J * K F I
K * * G J
L * * H *

笔记说:

我们不能假设房间按字母顺序 A - Z,我们预计最多有 12 个房间,每个字母或星号之间有一个空格。

这是我目前所拥有的:

void Maze::read_maze(string FileName) {
    string line;
    ifstream inStream;
    inStream.open(FileName.c_str());
    int test = inStream.peek();
    int i = 0;
    if (!(inStream.fail())) {
        while (!inStream.eof() && test != EOF) {
            getline(inStream, line);
            Node n(line[0]);
            i++;
            rooms[i] = n;
            if (!(line[2] == '*')) {
                Node North = find_Node(line[2]);
                (find_Node(line[0])).set_North(&North);
            }
            if (!(line[4] == '*')) {
                Node East = find_Node(line[4]);
                (find_Node(line[0])).set_East(&East);
            }
            if (!(line[6] == '*')) {
                Node South = find_Node(line[6]);
                (find_Node(line[0])).set_South(&South);
            }
            if (!(line[8] == '*')) {
                Node West = find_Node(line[8]);
                (find_Node(line[0])).set_West(&West);
            }
        }
        currentRoom = find_Node('A');
    } else {
        cout << "Could not open the file, please choose another.\n" << endl;
        exit(1);
    }
}

当我开始解析文件时,我的程序会调用我拥有的函数来检查文件是否为空。所以我认为我正在错误地读取文件。

【问题讨论】:

  • 您需要什么帮助?您似乎已经有了一些代码 - 它可以工作吗?
  • @JonathanPotter 感谢您的回复,当我开始解析文件时,我的程序调用了检查文件是否为空的函数。所以我认为我正在错误地读取文件。
  • 一些笔记。您使用了不必要的括号。 (find_Node(line[0])).set_North(&amp;North); 可以是find_Node(line[0]).set_North(&amp;North);!(line[2] == '*') 可以是line[2] != '*'。您不应该在 C++ 程序中使用EOF。也许最重要的是,在提出问题时,您应该将其减少到最小的误解;如果您收到代码说文件为空,那么迷宫问题定义对您的问题真的很重要吗?如果是“如果文件包含*,则打印0,如果是字母,则打印1”
  • 在审查代码时,可读性有很大的不同。例如,您可能有一个“无效的节点对象”,例如“静态节点无效;”,find_Node() 可以返回(当找不到指定的节点时它会返回什么?)。然后你不需要检查 == '*',因为你可以简单地写 rooms[i].set_West(find_Node(line[8]); ... 如果 line[8] 是 *,你会设置无效节点。
  • 您所有的 set 调用(例如 set_West ())都在获取堆栈上的 Node 对象的引用或指针,这将在退出 if () 块后超出范围,离开悬空指针或引用。

标签: c++ file pointers text graph


【解决方案1】:

您不能在程序运行时使用调试器来检查值吗?如果没有,那就试试

cost << line <<  endl; 

在getline之后,验证每一行读入的实际数据。

【讨论】:

  • 添加cout后
  • 还有一点,line rooms[i] = n;应该是房间 [i] = find_Node (line [0]);因为该房间可能已经被添加为另一个房间的位置..
  • 还有一点,line rooms[i] = n;应该是房间 [i] = find_Node (line [0]);因为房间可能已经被添加为另一个房间的位置......在这种情况下,find_Node 应该创建一个新房间并在它不存在时返回它......
猜你喜欢
  • 1970-01-01
  • 2011-09-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多