выходная функция void в txt - PullRequest
3 голосов
/ 05 марта 2011

Я только во втором квартале C ++, поэтому, пожалуйста, будьте проще, ответы ....

У меня довольно грязная программа с ссылками, классами и файлами ввода / вывода Я довольно много сделал с программой, но я не могу получить ее для вывода в .txt Возможно, это был мой плохой макет кодирования, так как вывод текста ускользнул от меня, когда я написал это. рассматриваемая функция:

tag.display_balance(); 

обратите внимание, что эта функция находится внутри списка ссылок (тега), который входит в класс, и вызывает функцию (display_balance) для печати выходных данных.

все выходит на консоль просто отлично. но я не знаю, как получить его сохранить на .txt несколько поисков в Google и на форуме не показали ничего, что я могу понять. Я попробовал:

ofstream BilloutPut;
BilloutPut.open("BillingStatements.txt");
BilloutPut<< tag.display_balance(); 

это единственный способ, которым я научился выводить в файл, но так как это пустая функция, она не сработала. Я хотел бы избежать перегрузки функции <<, если это возможно. </p>

-Спасибо за взгляд

Ответы [ 2 ]

6 голосов
/ 05 марта 2011

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

Если вы можете изменить функцию, пусть она примет аргумент, который является объектом ostream для записи (по умолчанию это cout).

Если вы не можете изменить функцию, но она использует std::cout, вы можете использовать cout.rdbuf(newbuffer) для перенаправления std::cout, связав ее с другим пунктом назначения.

Если функция использует какую-то другую библиотеку ввода / вывода, вам, возможно, придется использовать freopen или даже dup2 для переназначения stdout (дескриптор стандартного выходного файла ОС) в другое место назначения.

И будьте осторожны, любой из методов, включающих перенаправление (т. Е. cout.rdbuf, freopen и dup2), создаст большой беспорядок в любой многопоточной программе. Это, вероятно, не относится к вам, как начинающему программисту, но когда вы начинаете с многопоточности, вам нужно спроектировать свои функции ввода-вывода так, чтобы они использовали любой поток, который вы хотите, глобальные решения просто не будут его сокращать.

0 голосов
/ 06 марта 2011

Спасибо за ответы, я думаю, что я собираюсь изменить функцию, но я не уверен, как работать с ostream.

void linkD :: display_balance () {

ListNode *nodePtr;
nodePtr = head;

while (nodePtr){
    nodePtr->driver.print_balanceReport();
    cout<<endl;
nodePtr = nodePtr->next;
}


void driver::print_balanceReport(){
    nBalance=balance;
    cout<<get_firstName()<<" ";
    cout<<get_lastName()<<" ";
    cout<<get_dLicense()<<" ";
    cout<<get_vLicense()<<" ";
    cout<<get_nBalance()<<" ";
    cout<<get_passed()<<" ";
    cout<<get_differance()<<" ";}

вывести из класса (драйвера)

, поэтому я бы изменил пустоту на ostream и обработал ее как функциютип??Кроме того, насколько я знаю, я могу просмотреть свой связанный список из основного, так что я пропущу функцию ??

...