繁体   English   中英

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

[英]C++ Writing to file or console by argument

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

对于好奇的..代码来自我正在研究的迷宫项目,我正在生成一个随机迷宫,解决它,并且还有可能从文件中读取迷宫然后解决它。 现在剩下的就是将它打印到文件中。 但正如所说,我想将我的普通打印合并到打印机上,而不是制作两个函数。 我只是想知道......有可能吗? 我的“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();
}

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

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

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

谢谢大家,我看了你的回复,我很感谢你提出的所有好评和努力来帮助我。 我找到了一个解决方案,我相信这是我能解决的问题的最佳解决方案。 我还添加了一些错误管理

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM