[英]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.