通过参数写入文件或控制台
C++ Writing to file or console by argument
好的,我想做一些我自己觉得很有趣的事情。我想在我的函数中有一个可选参数这个参数会做两件事;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;
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 如何从Windows控制台调用.exe(C++)以在不同的目录(或任何目录)中创建文件夹?
- 来自Visual Studio中控制台项目的exe文件?
- 从文件读取并通过矢量输出到控制台
- 将 clangd stderr 重定向到文件而不是控制台
- 保存文件并使控制台不关闭:Visual Studio 2019
- 打印到文件和控制台 C++
- 如何将控制台输出中的所有内容复制到文本文件?
- 有没有办法将 getline() 与外部文本文件一起使用,然后重新获得 cin 的控制权以从控制台获取输入?
- Visual Studio控制台调试了错误的文件
- Visual C 关闭文本文件和打开新的控制台窗口
- CPP 控制台,关闭时,打开另一个 cpp 文件
- C++ 使用简单的代码同时写入文件和控制台输出
- 将 ffmpeg 控制台输出重定向到C++中的字符串或文件
- 如何从控制台启动可执行文件并使用Qt读取输出
- catch2-输出到控制台和文件
- 嵌入批处理脚本文件并在C 控制台项目中运行
- C++同时记录到控制台和日志文件
- QT控制台:记录所有stdin和stdout要文件
- C++-将stdout/stderr复制到文件,同时保留控制台输出