如何在 C++ 中使用重载运算符写入数据时防止 fstream 输出跳到 Excel 中的下一行

How to prevent fstream output from skipping to the next row in Excel when writing data using overloaded operators in C++

提问人:znxaz 提问时间:5/11/2023 最后编辑:user12002570znxaz 更新时间:5/11/2023 访问量:29

问:

因此,我正在使用 fstream 将数据输出到 Excel 工作表。我有一个 Base 类和一个派生类,我正在尝试使用派生类中的重写运算符输出一些数据。当我调用 Base 类中的重写运算符时,一切正常,并且我得到了预期的输出。但是,当我尝试使用派生类中的重写运算符输出其他数据时,它会跳到 Excel 工作表中的下一条记录,而不是停留在同一条记录上。

换句话说,当我真的希望该数据与 Base 类的运算符输出的数据位于同一行时,我在 Excel 工作表中为我尝试输出的其他数据获取了一行新行。

以下是 Base 类运算符的代码:

ostream& operator<<(ostream& out, const Person& P)
{
    out << "First Name, Last Name, Age, Sex, Personal ID, Birthday/n";

    out << P.First_Name << "," << P.Last_Name <<
        "," << Page << "," << P.Sex
        << "," << P.personalID << ","
        << P.Birthday;

    return out;
}

这是派生类运算符的代码:

ostream& operator<<(ostream& out, Student& S)
{
    out << static_cast<Person&>(S) << "Number of Courses: " << S.numOfCourses << ",";
    return out;
}
C++ IO

评论

0赞 463035818_is_not_an_ai 5/11/2023
看看 Person 有什么作用:它首先写入一个标头,然后写入数据。您需要对 执行相同的操作。您不能像现在这样重用实现operator<<StudentPerson
0赞 jls28 5/11/2023
用 const Student 参数定义 : 'ostream& operator<<(ostream& out, const Student& S)'
0赞 znxaz 5/11/2023
@jls28 派生类的运算符<< Student 需要使用static_cast调用父类 Person 的运算符<<。但是,此强制转换要求对正在强制转换的对象的引用不是常量。因此,运算符<< for Person 不能定义为常量。这是使操作员<<学生正确使用static_cast的唯一方法。

答:

0赞 463035818_is_not_an_ai 5/11/2023 #1

基类重载是糟糕的设计。它在一个方面做得太多了:它写入一个标头(包括 )并写入数据。对于 ,您需要 and 标头,然后是 和 数据。使用当前代码无法做到这一点。重构重载为:\nStudentPersonStudentPersonStudentPerson

ostream& operator<<(ostream& out, const Person& P)
{
    P.writeHeader(out);
    out << "\n";
    P.writeData(out);
    return out;
}

然后,您可以重用 和 在实现 的重载时 .Person::writeHeaderPerson::writeDataStudent