gpt4 book ai didi

c++ - I/O 重载和从文本文件中读取

转载 作者:行者123 更新时间:2023-11-28 08:17:52 25 4
gpt4 key购买 nike

我需要为一个将对象数组作为私有(private)变量的类定义一个读取和打印函数。我必须从文本文件中读取对象并将它们打印到屏幕上。为此,我需要重载 << 和 >> 运算符。我知道我需要使用循环来读取和打印存储在数组中的信息,但我不确定如何完成此操作。我的讲师给了我们一个框架代码,它基本上是函数原型(prototype)和我需要坚持的主要函数。我理解这是如何与公共(public)结构一起工作的,因为我已经使用它完成了这个确切的场景,但是类的私有(private)变量'让我感到困惑。

class EmployeeList {
public:
//Constructors
EmployeeList();
EmployeeList(istream&);
//Accessors
bool isEmpty() const;
bool isFull() const;
int size() const; //Number of employees in list
Employee item(int i) const; //i'th employee
//Mutators
void setItem(int i,const Employee& e);
//I/O functions, sets the i'th emplyee to e
void read(istream&);
void print(ostream&) const;

private:
enum {MAXSIZE = 100};
Employee list[MAXSIZE];
int count; //Number of employees in the current list
};

EmployeeList::EmployeeList() {
count = 0;
}

EmployeeList::EmployeeList(istream& in) {
//list[MAXSIZE] = in;
}

bool EmployeeList::isEmpty() const {
return (count == 0);
}

bool EmployeeList::isFull() const {
return (count == MAXSIZE);
}

int EmployeeList::size() const {
return count;
}

Employee EmployeeList::item(int i) const {
}

void EmployeeList::setItem(int i, const Employee& e) {
}

void EmployeeList::read(istream& in) {
Employee tempList;
while (in >> tempList) {
}
}

void EmployeeList::print(ostream& out) const {
for (int i=0; i < size(); i++) {
}

cout << out;
}

上面部分是EmployeeList类,下面部分是重载函数。注释掉的部分是我认为可能行得通但行不通的想法。

istream& operator>>(istream& in, EmployeeList& l) {
l.read(in);
return in;
}

ostream& operator<<(ostream& out, const EmployeeList& l) {
l.print(out);
return out;
}

下面是给我们的主要功能。

int main() {
authorInfo();
ifstream infile("a1in.txt");
if(!infile) {
cout << "file 'alin.txt' not found.";
return EXIT_FAILURE;
}
EmployeeList theList(infile);

cout << endl;
cout << theList.size() << " employees read:\n" << theList << endl;
process(theList);
return EXIT_SUCCESS;

}

希望有人能引导我朝着正确的方向前进!如果您需要更多代码,请告诉我。谢谢!

编辑:员工阅读和打印功能:

void Employee::read(istream& in) {
in >> name >> id >> salary;
}

void Employee::print(ostream& out) const {
out << getName() <<" "<< getID() <<" "<< getSalary() << endl;
}

员工重载:

istream& operator>>(istream& in, Employee& e) {
e.read(in);
return in;
}

ostream& operator<<(ostream& out, const Employee& e) {
e.print(out);
return out;
}

编辑 2:更新了 read() 函数。带有 while 的那一行是错误所在。

void EmployeeList::read(istream& in) {
Employee inEmployee;
while (in >> inEmployee && count < MAXSIZE) {
list[count] = inEmployee;
count++;
}
}

编辑 3:这是我目前拥有的 print() 函数。它确实打印了,但我得到的是默认的构造函数信息,而不是来自文件的信息。这是读取或打印功能问题吗?我还在考虑阅读功能。

void EmployeeList::print(ostream& out) const {
cout << endl;
for (int i=0; i < count; i++) {
out << list[count];
}
}

最佳答案

数组边界

在你的类里面,你有:

Employee list[MAXSIZE];

鉴于此,您尝试的代码存在错误:

EmployeeList::EmployeeList(istream& in) {
list[MAXSIZE] = in;
}

list只有来自 list[0] 的元素至 list[MAXSIZE - 1] . list[MAXSIZE]超过数组末尾的一个,无效。

构造函数

也就是说,我强烈建议不要使用采用 istream& 的构造函数.最好用默认构造函数构造一个空对象,然后使用它的 read(istream&)方法(通过 operator << )加载数据。换句话说,而不是:

EmployeeList theList(infile);

使用:

EmployeeList theList;
infile >> theList;

如果您需要有一个接受 istream& 的构造函数, 让它调用 read()初始化对象后:

EmployeeList::EmployeeList(istream& in): count(0) {
read(in);
}

注意只有一个构造函数被调用,所以EmployeeList::EmployeeList()中的初始化不会发生在 EmployeeList::EmployeeList(istream&) .我听说新版本的 C++ 处理了这种不必要的重复,但目前我们就是这样做的。

命名

另一件事:您的代码将不会因更好的变量名而混淆。在这种情况下:

void EmployeeList::read(istream& in) {
Employee tempList;
while (in >> tempList) {
}
}

不要说tempList因为它不是“临时列表”,所以它是单个 Employee已阅读。更好的做法是:

void EmployeeList::read(istream& in) {
Employee inEmployee;
while (in >> inEmployee) {
list[count++] = inEmployee;
}
}

关于c++ - I/O 重载和从文本文件中读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7009966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com