C ++:将文本文件读入二维数组

时间:2018-11-27 13:25:44

标签: c++ maze

我正在尝试读取以下maze.txt文件:

35
35
0
10
++++++++++S++++++++++++++++++++++++
++++++++++OOOOOOOOOOOOOOOOOOOOOOOOO
++++++++++O++++++++++++++++++O+++++
OOOOOOOOOOOOOOOOOOOOOOOOOO+++O++OOE
O+++++++++O++++++++++++++O+++O++O++
OOOOOO++++O++++++++++++++O+++O++O++
O++++O++++OOOOOOOOOOO++++O+OOO++O++
O++++O++++O+++++++++OOOO+O+++O++O++
OOO++OOOO+OOOOOO+++++++++++OOO++OOO
O+O+++++O++++++OOOOOOOOOO++O++++++O
O+OOOO++O++++++O++++++++O+++OOO+++O
O++++O++OOOOOOOO++++++++O+++O+O+++O
OOO++O++++++++++++++++++OOOOO+O+++O
++O++OOOOOOOOOOOOOOOO+++++++++OO++O
OOO+++++++++++++++++OOOOOO++++++++O
O++++++++++++++++++++++++O++OOOOOOO
+++++++++++++++++++++++++O++O++++++
OOOOOOOOOOOOOOOOOOOOOOOOOO++OOOOO++
O++++++++++++++++++++++++O++++++O++
OOOOOOO+++++++++++++++OOOOOOO+++O++
++++++++++++++++++++++O+++++OO++O++
OOOOOOOOOOOOOOOOOOOOOOO++++++O++O++
O++++++++++++++++++++++++++++O+OOOO
OOOO++++++++++++++++++++OOOOOO+O+++
+++OOOOOOOOO+++++++++++++++++++O+++
+++++O+++++OOOOOOOOOO++++++++OOO+++
+O+++OOOOO++++++O++++++++++++O+++++
+OOOOO+++O++++++OOOOOO+++++++O+++++
+++++++++++++++++++++OOOOOOOOO+++++
OOOOOOOOOOOOOOOOOOOOOO+++++++++++++
+++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++++++++

该代码可以在代码中的迷宫中正常工作,但是我将其移到了一个文本文件中,该文件似乎可以读取,但无法正常工作。这给了我错误:

No matching function for call to 'mazeTravel'.

我不确定从这里去哪里。任何帮助将不胜感激!

#include <iostream>
#include <fstream>

using namespace std;

void printMaze(const char maze[][12], int xCoordinate, int yCoordinate);
int mazeTravel(char maze[][12], int xCoordinate, int yCoordinate, int direction);

int main()
{
    char maze[35][35];
    ifstream file;
    file.open("maze.txt");
    if (!file) {
        cout << "Error reading file\n";
        return -1;
    }
    else {
        for (int row = 0; row < 35; row++) {
            for (int column = 0; column < 35; column++) {
                file >> maze[row][column];

                int success = 0;
                success = mazeTravel(maze, 2, 0, 1);
                if (success == 1)
                    cout << "The maze has been solved.\n";
                else
                    cout << "Sorry, the maze cannot be solved\n";
            }
        }
    }
    return 0;
}

2 个答案:

答案 0 :(得分:0)

您没有实施的问题

int mazeTravel(char maze[][12], int xCoordinate, int yCoordinate, int direction);

您应按以下方式创建实现:

int mazeTravel(char maze[][12], int xCoordinate, int yCoordinate, int direction)
{
    // The implementation
    return 0;
}

另一件事:您必须阅读文件开头的前几个数字。

35
35
0
10

之后,您可以从文件中读取矩阵

答案 1 :(得分:0)

您可以使用std::vector中的std::string来表示迷宫:

std::vector<std::string> maze;

要访问其单元格,请使用

maze[row][column];  // with row being y and column x

要获取行数,请使用

maze.size()

maze[0].size()

列数。

您可以阅读这样的迷宫(无需检查错误就不会使代码混乱):

std::vector<std::string> readMaze(std::istream &is)
{
    std::size_t columns;        
    std::size_t rows;
    is >> columns >> rows;

    int foo;             // sorry, don't know what the 3rd and 4th 
    is >> foo >> foo;    // number is. a starting position, perhaps?

    // ignore the rest of the current line:
    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    std::string line;
    std::vector<std::string> maze;

    while (std::getline(is, line))
        maze.push_back(line);

    return maze;
}

一个实现(带有错误检查)可能看起来像这样:

#include <cstdlib>  // EXIT_FAILURE
#include <limits>   // std::numeric_limits<>
#include <vector>
#include <string>
#include <fstream>
#include <iostream>

// to not have to type std::vector<std::string> all over the place
using maze_type = std::vector<std::string>;

void printMazeCell(maze_type const &maze, std::size_t x, std::size_t y)
{
    std::cout.put(maze[y][x]);
}

void printMaze(maze_type const &maze)
{
    for (auto const &row : maze)
        std::cout << row << '\n';
}

int mazeTravel(maze_type const &maze, std::size_t x, std::size_t y, int dir)
{
    // access cells of the maze with maze[y][x]
    // maze.size() for the number of columns and
    // maze[0].size() for the number of rows
    return 42;
}

maze_type readMaze(std::istream &is)
{
    std::size_t columns;
    if (!(is >> columns)) {
        std::cerr << "Couldn't read the number of columns :(\n\n";
        return maze_type{};  // return an empty maze on error
    }

    std::size_t rows;
    if (!(is >> rows)) {
        std::cerr << "Couldn't read the number of rows  :(\n\n";
        return maze_type{};
    }

    int foo;
    is >> foo >> foo;  // sorry, don't know what the 3rd and 4th number is

    // ignore the rest of the current line:
    is.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

    std::cout << "Trying to read a maze with " << columns << " columns ...\n";

    std::string line;
    maze_type maze;
    while (std::getline(is, line)) {
        if (line.length() != columns) {
            std::cerr << "Found a row that contains only "
                << line.length() << " columns :(\n\n";
            return maze_type{};
        }
        maze.push_back(line);
    }

    if (maze.size() != rows) {
        std::cerr << "The maze only consists of "
                  << maze.size() << " rows :(\n\n";
        return maze_type{};
    }

    return maze;
}

int main()
{
    char const *filename = "maze.txt";
    std::ifstream is{ filename };
    if (!is.is_open()) {
        std::cerr << "Couldn't open \"" << filename << "\" for reading :(\n\n";
        return EXIT_FAILURE;
    }

    maze_type maze = readMaze(is);

    if (!maze.size()) {  // readMaze returned an empty maze :(
        std::cerr << "Bye.\n";
        return EXIT_FAILURE;
    }

    printMaze(maze);
}