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

时间:2013-05-31 18:59:23

标签: c++ file printing arguments optional

好的,所以我想做一些我自己确实发现的内容。我希望在我的函数中有一个可选的参数,这个参数会做两件事; 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 个答案:

答案 0 :(得分:4)

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

然后只传递你想写的任何流。

答案 1 :(得分:2)

最好的方法是,如果要写入文件,则std::ostream*指向std::ofstream;如果要写入控制台,则指向std::cout。< / p>

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

答案 2 :(得分: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();
}

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

这在一些不太重要的钝化意义上也会更高效,因为你不需要进行一系列的字符串比较。

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

答案 3 :(得分: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;