我有以下代码
void print(int & a, double & b, string & c)
{
cout << setprecision(2) << fixed;
const double GPA = a/b;
if(c == "Y")
{
cout << "\n\nTotal number of credit hours: " << a << endl;
}
else
{
cout << "\n*** Grades are being held for not paying the tuition. ***"
}
}
如何在cout
中将print(int, double, string)
写入文本文件而不会篡改print(int, double, string);
?我试过这样的事情
ofstream file;
file.open("file.txt");
file << print(a,b,c);
file.close();
cout << "file created" << endl;
但这并没有编译。为什么不,我该如何解决?
答案 0 :(得分:7)
您编写它的方式,您的print()
函数无法输出到任何给定的流。这是因为它将写入的流硬编码为cout
。
如果希望它能够写入任何给定的流,则必须将流参数化为另一个函数参数。对于(1)方便性和(2)与假定print()
只需要三个参数并写入cout
的现有代码的兼容性,您可以通过将新参数默认为cout
来使新参数可选:
void print(int& a, double& b, string& c, ofstream& os=cout) {
os << setprecision(2) << fixed;
const double GPA = a/b;
if (c == "Y") {
os << "\n\nTotal number of credit hours: " << a << endl;
} else {
os << "\n*** Grades are being held for not paying the tuition. ***";
}
}
然后你可以按如下方式调用它:
print(a,b,c,file);
您的代码无法编译的原因是您不能将void作为函数参数或操作符操作数传递。当函数声明为返回void时,这意味着它根本不返回任何内容。 print()
没有返回流到流的数据。流式传输发生在函数内部,因此只有您可以选择要写入输出的流。
答案 1 :(得分:2)
bgoldst的回答解决了问题,但我建议采用完全不同的解决方案。将数据粘贴到operator<<
重载的类中。
struct class_results {
int credits;
double GP_total;
bool tuition_paid;
};
std::ostream& operator<<(std::ostream& out, const class_results& c) {
if (c.tuition_paid) {
const double GPA = c.credits/c.GP_total;
out << "Total number of credit hours: ";
out << setprecision(2) << fixed << c.credits<< '\n';
} else
out << "\n*** Grades are being held for not paying the tuition. ***"
return out;
}
然后使用稍微更正常:
class_results results = {num_credits,GPTottal,tuition};
ofstream file;
file.open("file.txt");
file << results;
file.close();
cout << "file created" << endl;
答案 2 :(得分:1)
如何在不篡改
cout
的情况下将print(int, double, string)
print(int, double, string);
写入文本文件中?
你不能
功能print
已被破坏,您无法在不修复的情况下执行所需操作。