无操作员错误代码



我正在使用C++语言填写酒店预订表。我一直没有收到 fin 的操作员错误 !=0。如何解决此错误?这是实际的编码...

void Hotel::show_room_record()
{
cout << "R.Num" << setw(10) << "R.Stat" << setw(10) << "Category" << setw(10) << "Rentn";
ifstream fin("room.dat", ios::in);
for (int p = 0; fin != 0; p = p + 15)
{
fin.seekg(p);
fin >> room_no;
fin >> room_status;
fin >> category;
fin >> rent;
cout << room_no << setw(10) << room_status << setw(10) << category << setw(10) << rent << "n";
}
fin.close();
}

您无法将 fin 与 0 进行比较,fin 不会返回下一个输入。 首先将输入存储在变量中,然后进行比较。

对于您的情况,您可能需要检查下一个字符是"0",甚至是"\0"。 尝试使用这个: http://www.cplusplus.com/reference/istream/istream/peek/

您的条件变为(假设您想要"\0"):

fin.peek() != 0

您无法测试fin != 0fin不是一个数字,测试与 0 的相等性与测试苹果是什么样的橙色一样有意义。您可以通过利用运算符 bool 来测试fin是否仍然可读,尽管使用简单的fin,但这很棘手,因为测试是否可读将在读取之前进行。在有机会失败之前,您无法测试失败,这留下了最后一次读取失败且未检查有效性的可能性。

与其试图解决这个问题,我在这里对你进行所有 X-Y 并提出完全不同的建议。

定义结构

struct room
{
int room_no;
string room_status;
string category;
int rent; // could be a float. Don't care much for this example
// that said, watch out for rounding errors when dealing with floats  
};

创建一个函数,使其非常容易读入此结构

std::istream & operator>>(std::istream & in,
room & inroom)
{
in >> inroom.room_no >> inroom.room_status >> inroom.category >> inroom.rent;
return in;
}

创建一个函数,使编写此结构变得非常容易

std::ostream & operator<<(std::ostream & out,
const room & outroom)
{
out << outroom.room_no << setw(10) << outroom.room_status << 
setw(10) << outroom.category << setw(10) << outroom.rent;
return out;
}

使上述结构的std::vector成为Hotel类的成员

std::vector<room> rooms;

将文件读入其中

room temp;
while (in >> temp)
{    
rooms.push_back(temp);
}

现在,酒店知道所有房间的状态,而不必继续查看文件。这使得打印变得容易。

for(room & r: rooms)
{
cout << r << 'n';
}

它使找到任何房间都成为房间的简单遍历

for(room & r: rooms)
{
if (r.whatever == desiredwhatever)
{
return r;
}
}

如果房间被更改,您时不时地重写文件。

std::ostream outfile("path to file goes here");
for(room & r: rooms)
{
if (!(outfile << r << 'n'))
{
//handle error
}
}

无论如何,所有这些事情你都可能必须做。唯一的缺点是如果您不被允许使用std::vector.在这种情况下,你要么写一个简单的vector替代品,要么使用一个数组并祈祷它永远不会溢出。

相关内容

最新更新