【发布时间】:2021-12-16 08:52:04
【问题描述】:
编译器报错:Expression: invalid operator
#include<iostream>
#include<fstream>
#include<algorithm>
using namespace std;
struct ticket{
char destination[50];
char flightNumber[50];
char Aircraft[50];
};
bool comparator(ticket a, ticket b)
{
return a.destination < b.destination;
}
int main()
{
const int SIZE = 6;
char mydestination[40];
ticket newA[SIZE];
fstream f;
f.open("records.dat", ios::in | ios::binary);
if (f.is_open())
{
f.read(reinterpret_cast<char*>(newA), SIZE *sizeof(ticket));
f.close();
}
else
cout << "ERROR\n";
sort(newA, newA + SIZE, comparator);
for (ticket& s : newA)
{
cout << s.destination;
cout << s.Aircraft;
cout << s.flightNumber << endl;
}
system("pause");
return 0;
}
【问题讨论】:
-
a.destination < b.destination不比较字符串;它比较地址(表现出未定义的行为,因为它们不是指向同一数组的指针)。要比较 C 风格的字符串,请使用strcmp -
您应该将
comparator的参数作为const引用传递,因为您没有修改它们。该引用可防止编译器复制您的变量(按值传递)。 -
"Expression: invalid operator
-
优先使用
std::string文本而不是字符数组。您可以使用==比较std::string,但对于字符数组,您需要strcmp。 -
这并没有解决问题,而是养成使用有意义的值初始化对象的习惯,而不是默认初始化它们并立即覆盖默认值。在这种情况下,这意味着将
fstream f; f.open("records.dat", ios::in | ios::binary);更改为fstream f("records.dat", ios::in | ios::binary);。此外,由于f仅用于输入,其类型应为ifstream而不是fstream。这样你就不必告诉构造函数它是一个输入流:ifstream f("records.dat", ios::binary);就足够了。