Возможность распечатать вывод на экран или заданное имя файла (c ++) - PullRequest
0 голосов
/ 08 апреля 2020

Я бы хотел, чтобы опция 2 передавала вывод в набранное имя файла. Однако программа создает файл, но не передает выходные данные в файл. Я думаю, что просто использовать ostream здесь хорошо, но я не знаю, как go об этом.

void displayTable(int n, char op) {
    int printOption;
    string outputFileName;
    ofstream createOutputFile;

    while (true) { //option for print screen or print to file
        cout << "Select: \n1) Print on Screen \n2) Print to a file name \nSelection: ";
        cin >> printOption;

        if (printOption == 1)
            break;
        else if (printOption == 2){
            cout << "Type in the name for the output file." << endl;
            cin >> outputFileName;
            createOutputFile.open(outputFileName);
            break;
        }
        else
            cout << "Please enter a valid number." << endl;
    }

    int max = getMaxSize(n, op);
    cout << setw(max) << op << "|";
    for (int i = 1; i <= n; ++i) {
        cout << setw(max) << i;
    }
    cout << endl;
    for (int i = 0; i < max; ++i) {
        cout << "-";
    }
    cout << "+";
    for (int i = 0; i < n * max; ++i) {
        cout << "-";
    }
    cout << endl;
    for (int i = 1; i <= n; ++i) {
        cout << setw(max) << i << "|";
        for (int j = 1; j <= n; ++j) {
            cout << setw(max) << getValue(i, j, op);
        }
        cout << endl;
    }

    cout << endl;
    createOutputFile.close();
}

1 Ответ

0 голосов
/ 08 апреля 2020

Вы ничего не печатаете на createOutputFile, вместо этого все печатается на cout. Вот почему ничего не видно в файле, а все в консоли.

Самый простой способ решить вашу проблему - перенаправить cout в createOutputFile выходной буфер, например:

auto cout_buff = cout.rdbuf();
...
createOutputFile.open(outputFileName);
cout.rdbuf(createOutputFile.rdbuf())
// all cout outputs will now go to the file...
...
cout.rdbuf(cout_buff); // restore when finished...

В противном случае переместите логи печати c в отдельную функцию, которая принимает ostream& в качестве параметра:

void doMyLogic(ostream &os)
{
    // print to os as needed...
}

...

if (printOption == 1) {
    doMyLogic(cout);
    break;
} 
if (printOption == 2) {
    ...
    ofstream createOutputFile(outputFileName);
    doMyLogic(createOutputFile);
    break;
}
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...