使用重载输入流运算符读取带字符串的文件>>

Posted

技术标签:

【中文标题】使用重载输入流运算符读取带字符串的文件>>【英文标题】:Reading File with Strings using overloaded input stream operator>> 【发布时间】:2016-03-28 03:17:09 【问题描述】:

我试图通过重载 istream 运算符从文件中获取输入。为此,我宣布它为班级的朋友。然后,我将相同的类作为输入:

file >> *(class pointer);

当我尝试调试需要它工作的代码部分时,它会按预期进入:

istream& operator>> (istream& in, MYCLASS& n)

    string buffer;
    while (!in.eof())  // input is a file
        in >> buffer;
        // do stuff
    
    return in;

问题是缓冲区保持为空(“”)并且没有从文件中获取它假设的内容。通常,文件的格式应该没有问题,因为我在代码中的其他地方使用了类似的方法,没有问题,但在这里以防万一:

* Name Age
* Name Age
* Name Age
...

我应该在我的 istream 重载函数中放入什么,以便按预期获得输入?

【问题讨论】:

【参考方案1】:

这...

while (!in.eof()) 

...坏了。您应该尝试读取数据并将其解析到变量中,然后检查失败/eof。不要假设您在阅读最后一个MYCLASS 后一定会在文件末尾。而是:

string name;
int age;
while (in >> name >> age)
    ...do stuff...

如果您确实在每一行上都有某种前导点,请添加 char 并同时阅读:

char dot;
string name;
int age;
while (in >> dot && dot == '.' && in >> name >> age)
    ...do stuff...

更一般地说,假设输入流的其余部分将包含一个 MYCLASS 对象,这不是一个非常可扩展的模型。您可以改为使用分隔符(例如,当一行中的第一个单词不是名称,而是 <END> 时),终止循环。

【讨论】:

谢谢您,根据您的解释,我设法找到了解决方案!

以上是关于使用重载输入流运算符读取带字符串的文件>>的主要内容,如果未能解决你的问题,请参考以下文章

C++ 输入/输出运算符重载

重载流提取运算符

C++重载IO输入输出流运算符

C++重载IO输入输出流运算符

C++重载IO输入输出流运算符

C++重载IO输入输出流运算符