3

好的,所以我想做一些我自己觉得很有趣的事情。我想在我的函数中添加一个可选参数,这个参数会做两件事;1. 决定文本是打印到控制台还是文件 2. 如果是这种情况,将其打印到文件,否则打印到控制台

我希望它在同一个函数中,因为我想要非常高效的代码。这就是我试图解决的方法,但显然不起作用

void Maze::Print_maze(std::string file = "no!ne") const{
    if (file != "no!ne")
        std::ofstream outfile(file);
    for (int i = 0; i < Map.size(); i++)
    {
        for (int j = 0; j < Map[i].size(); j++)
        {
            if (file == "no!ne")
                std::cout << Map[i][j];
            else
                outfile << Map[i][j];
        }
        if (file == "no!ne")
            std::cout << std::endl;
        else
            outfile << std::endl;
    }
}

对于好奇的人.. 代码来自我正在研究的一个迷宫项目,我正在生成一个随机迷宫,解决它,还有可能从文件中读取迷宫然后解决它。现在剩下的就是将其打印到文件中。但如前所述,我不想创建两个函数,而是将我的普通打印合并到控制台与打印到文件。我只是想知道如何..有可能吗?我的“地图[][]”是vector <vector<char> >

4

4 回答 4

4

void Maze::Print_maze(std::ostream& s = std::cout)

然后只需传递您要写入的任何流。

于 2013-05-31T19:09:49.153 回答
2

如果要写入文件或要写入控制台,最好的方法是使用std::ostream*指向的 。std::ofstreamstd::cout

std::ostream* outputTarget = &std::cout;

void output(const std::string& message)
{
    *outputTarget << message;
}

void useFileOutput()
{
    static std::ofstream outFile;
    if (!outFile.is_open())
        outFile.open("log.txt");
    outputTarget = &outFile;
}

void useCout()
{
    outputTarget = &std::cout;
}
于 2013-05-31T19:08:11.833 回答
1

在您的情况下,我会创建 3 个功能,其中两个带有您想要消除歧义的签名,另一个带有实际工作的签名。通过这种方式,您可以获得一个功能完成工作的统一性和两个功能的清洁度:

public:
void Maze::Print_maze(std::ostream& OutputTarget){
   for (int i = 0; i < Map.size(); i++)
   {
       for (int j = 0; j < Map[i].size(); j++)
       {
           OutputTarget << Map[i][j];
       }
       OutputTarget << std::endl;
   }
}

void Maze::Print_maze() const{
   Print_maze(std::cout);
}

void Maze::Print_maze(std::string file) const{
   std::ofstream Output_file(file.c_str());
   Print_Maze(Output_file);
   Output_file.close();
}

传递对基本类型的引用允许您的迷宫输出逻辑忽略实际输出类型并专注于渲染迷宫。

这在某种不太重要的钝感上也将具有更高的性能,因为您不需要进行一系列字符串比较。

更重要的是,这个版本与演示和业务(迷宫渲染现在是一个业务)逻辑分开更简单,因此更容易阅读并且不易出错。

于 2013-05-31T19:12:00.413 回答
0

谢谢大家,我阅读了您的回复,感谢您为帮助我所做的所有良好评论和努力。我找到了一个解决方案,我相信这是我能想出的解决问题的最佳方案。我还添加了一些错误管理

void Maze::Print_maze(std::string file) const{
    std::ofstream outfile(file);
    // if file is open, write to file otherwise write to console
    std::ostream &out= (!outfile.is_open()? std::cout : outfile);
    // Check if file failed to open
    if(file != "" && (!outfile.is_open()))
        std::cerr << "File failed to open." << std::endl;
    for (int i = 0; i < Map.size(); i++)
    {
        for (int j = 0; j < Map[i].size(); j++)
        {
                out << Map[i][j];
        }
            out << std::endl;
    }
    if(outfile.is_open())
        outfile.close();
}

编辑:忘了提这个..我的 Maze.h 文件和我的班级包含这个函数声明:

void Print_maze(std::string file = "") const;
于 2013-05-31T20:13:05.743 回答