我只是在c ++的第二季度,所以请保持答案简单....
我有一个非常混乱的程序,包含linklist,class和file i / o 我已经完成了该程序,但我无法将其输出到.txt 这可能是我糟糕的编码布局,因为当我写这篇文章时输出让我不知所措。 有问题的功能是:
tag.display_balance();
请注意,此函数位于一个链接列表(标记)内,该列表进入一个类并调用函数(display_balance)来打印输出。
一切都很好地出现在控制台上。但我不知道怎么把它保存到.txt 一些谷歌和论坛搜索没有显示我能理解的任何内容。 我试过了:
ofstream BilloutPut;
BilloutPut.open("BillingStatements.txt");
BilloutPut<< tag.display_balance();
这是我学习如何输出到文件的唯一方法,但由于它是一个void函数,所以它不起作用。我想远离重载&lt;&lt;尽可能的功能。
-Thanks for looking
答案 0 :(得分:6)
如果该函数执行自己的文件I / O,则会很困难(这就是为什么存在“关注点分离”软件设计指南的原因,这显然在这里被违反了)。重载operator <<
无济于事,这个操作符放置在任何地方的函数都没有返回值。
如果您可以修改该函数,请让它接受一个参数,该参数是要写入的ostream
对象(默认为cout
)。
如果您无法修改该功能,但使用std::cout
,则可以使用cout.rdbuf(newbuffer)
通过将其与其他目的地相关联来重定向std::cout
。
如果函数使用其他一些I / O库,则可能必须使用freopen
甚至dup2
将stdout
(操作系统标准输出文件描述符)重新映射到另一个目标。
请注意,任何涉及重定向的技术(即cout.rdbuf
,freopen
和dup2
)都会在任何多线程程序中造成巨大的混乱。这可能不适合作为初级程序员,但是当你开始使用线程时,你需要设计你的I / O函数来使用你想要的任何流,全局解决方案就不会削减它。
答案 1 :(得分:0)
感谢您的回复,我想我将修改该功能,但我不知道如何使用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()<<" ";}
从班级(司机)打印
所以我会将void更改为ostream并将其视为函数类型?也只是为了我的知识,我可以从主要遍历我的链表,以便我跳过功能?