通过参数写入文件或控制台

C++ Writing to file or console by argument

本文关键字:文件 控制台 参数      更新时间:2023-10-16

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

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

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;
    }
}

对于好奇的人…代码来自我正在做的一个迷宫项目,我正在生成一个随机迷宫,并解决它,也有可能从文件中读取迷宫,然后解决它。现在剩下的就是将它打印到一个文件中。但如前所述,与其创建两个函数,不如将正常的打印到控制台与打印到文件合并。我只是想知道怎么…这可能吗?我的"Map[][]"是vector <vector<char> >

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

然后传递你想写入的流

最好的方法是让std::ostream*指向std::ofstream,如果您想写入文件,或者std::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;
}

在你的情况下,我会使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();
}

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

这在某种意义上不太重要,也会提高性能,因为您不需要进行一系列字符串比较。

更重要的是,这个版本的表示和业务(迷宫渲染现在是一个业务)逻辑分开更简单,因此更容易阅读和更少的bug。

谢谢大家,我看了你们的回复,我很感谢你们给我的所有好的评论和努力。我想到了一个解决方案,我相信这是我能想到的最好的解决方案。我还添加了一些错误管理

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;