从输入文件中读取c ,具有iStream Operator Overloading

Reading from input file C++ with istream operator overloading

本文关键字:具有 iStream Operator Overloading 输入 文件 读取      更新时间:2023-10-16

我有一个我无法更改的输入文件,线略有不同

Supercar   HTT Technologies   10   2
Motorcycle   Honda   40   1
...

我已经超载了>>运算符,以便将值读取到我的数据结构中,如下所示:

class Vehicles{
private:
string type;  //type of vehicle, i.e. car/motorcycle
string manufacturer;
string manufacturer2ndPart //not a good idea, but this is what I'm using
                           //to get the second part of the manufacturer ("Technologies")
int milesPerGallon;
int numPrevOwn //number of previous owners
public:
...
friend istream &operator >> (istream &is, Vehicles &Vec){
 is >> Vec.type >> Vec.manufacturer >> Vec.milesPerGallon >> Vec.numPrevOwn;
 return is;
     }
};

这对第一行的工作正常,但是在输入文件的第二行中分解,因为它试图在" 40"中读取" 40"到Manufacturer2中,而不是Milespergallon。解决这个问题的最佳方法是什么?我想避免手动阅读所有内容,因为这打破了我的操作员过载的目的。

您的基本问题是流的>>在遇到whitespace时都会停止,并且您的输入文件包含空格作为数据,而不是要忽略的东西。因此,您的问题是需要不同数量的字符串,具体取决于行。

一般而言,您最好一次将整行阅读到字符串(例如使用std::getline()(。然后检查字符串,以确定其实际包含多少个字段,然后再尝试实际提取它们。换句话说,不要使用流operator从文件中读取(或写入它(。

稍微更改文件格式,因此当字符串字段的开头是明显的。例如,

之类的格式
"Supercar"  "HTT Technologies"   10     2
"Motorcycle" "Honda"    40     1

您仍然需要一次读取一行,但是使用"来界定字符串使识别每个字符串的开始和每个字符串都更加容易,并处理包含Whitespace(Newline除外(的每个字符串。如果您需要在字符串中具有 "字符,请指定它将在 之前进行,然后相应地解析输入。

显然,任何要读取或编写此类文件的代码都需要遵守相同的协议。并且阅读代码将需要处理错误(例如,不符合协议的文件(。