使用istream运算符重载从输入文件C ++读取

时间:2017-04-17 07:47:07

标签: c++ input operator-overloading istream

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

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”读入manufacturer2,而不是milesPerGallon。解决这个问题的最佳方法是什么?我想避免手动阅读所有内容,因为这会破坏我的操作员过载的目的。

1 个答案:

答案 0 :(得分:1)

您的基本问题是流的>>重载在遇到空格时全部停止,并且您的输入文件包含空格作为数据而不是要忽略的内容。因此,您需要根据线路需要不同数量的字符串。

一般来说,最好一次读一整行到一个字符串(例如使用std::getline())。然后检查字符串以计算实际包含的字段数,然后再尝试实际提取它们。换句话说,不要使用流媒体操作符从文件中读取(或写入文件)。

稍微更改文件格式也可能需要付费才能使字符串字段的开头显而易见。例如,像

这样的格式
"Supercar"  "HTT Technologies"   10     2
"Motorcycle" "Honda"    40     1

您仍然需要一次读取一行,但使用"分隔字符串可以更容易地识别每个字符串的开头和每个字符串,并处理包含空格的字符串(除了换行符)。如果您需要在字符串中包含"字符,请指定它前面有\,并相应地解析输入。

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