使用c ++

时间:2015-04-22 22:44:02

标签: c++ file-io

我有以下代码

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;

但这并没有编译。为什么不,我该如何解决?

3 个答案:

答案 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已被破坏,您无法在不修复的情况下执行所需操作。