bool函数无法返回true或false

时间:2017-03-26 16:58:13

标签: c++ class boolean

我正在编写的类方法必须将单词存储到不同的数组中,但还必须返回一个布尔值,表示文件是否已成功读入。一切看起来都很好,但我找不到逻辑错误。

我正在阅读的文件类型,其中空格由标签分隔

misspelledword     correctword
misspelledword2     correctword2
misspelledword3     correctword3

但格式也可以像这样

misspelledword     correctword correctword correctword

这是我的代码

bool SpellChecker::loadFile(string filename)
{

    ifstream ifile;
    ifile.open(filename.c_str());
    if (ifile.fail())
    {
        cout << "Error opening file" << endl;
        return false;
    }
    string line;
    int count = 0;
    while (getline(ifile, line))
    {
        istringstream iss(line);
        getline (iss, misspelled[count], '\t');
        getline (iss, correct[count]);
        count++;
    }
    if (ifile.good())
    {
        return true;
    }
    ifile.close();
}

不确定为什么它不应该返回false或true但是它返回一个随机数17,不知道它来自哪里?

1 个答案:

答案 0 :(得分:0)

如果循环失败,则缺少return语句,因此返回值将是未定义的。编译器应该已经警告过你。

此外,如果已达到EOF,good()将返回false。因此,您需要检查eof()和/或!fail()而不是good()

尝试更像这样的事情:

bool SpellChecker::loadFile(string filename)
{
    ifstream ifile(filename.c_str());
    if (!ifile)
    {
        cout << "Error opening file" << endl;
        return false;
    }

    string line;
    int count = 0;

    while (getline(ifile, line))
    {
        istringstream iss(line);
        getline(iss, misspelled[count], '\t');
        getline(iss, correct[count]);
        ++count;
    }

    return ifile.eof() && !ifile.fail();
    // or simply:
    // return (bool) ifile;
}

或者,在I / O错误上启用异常处理:

bool SpellChecker::loadFile(string filename)
{
    ifstream ifile;
    string line;
    int count = 0;

    ifile.exceptions(std::ifstream::badbit | std::ifstream::failbit);
    try
    {
        ifile.open(filename.c_str());

        while (getline(ifile, line))
        {
            istringstream iss(line);
            getline(iss, misspelled[count], '\t');
            getline(iss, correct[count]);
            ++count;
        }

        return true;
    }
    catch (const std::ios_base::failure &)
    {
        cout << "Error opening or loading file" << endl;
        return false;
    }
}