C ++ Запись в файл или консоль по аргументу

Итак, я хотел бы сделать что-то, что я нахожу довольно пересекающимся. Я хочу дополнительный аргумент в моей функции, и этот аргумент будет делать две вещи;
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> >

3

Решение

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

Затем просто передайте любой поток, в который вы хотите записать.

4

Другие решения

Лучший подход — это иметь 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;
}
2

В вашей ситуации я бы сделал 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();
}

Передача ссылок на базовые типы позволяет логике вывода лабиринта игнорировать фактический тип вывода и фокусироваться на рендеринге лабиринта.

Это в некотором тупом смысле, которое вряд ли имеет значение, также будет более производительным, потому что вам не нужно будет делать серию сравнений строк.

Что еще более важно, эта версия с разделением презентации и бизнес-схемы (рендеринг лабиринта теперь является бизнес-логикой) проще, поэтому ее легче читать и меньше подвержена ошибкам.

1

Спасибо, ребята, я прочитал ваши ответы, я благодарен за все хорошие комментарии и усилия, которые вы приложили, чтобы помочь мне. Я пришел к решению, и я считаю, что это лучшее решение моей проблемы, которое я могу придумать.
Я также добавил немного управления ошибками

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;
0
По вопросам рекламы [email protected]