2

我正在为我的 libspellcheck 拼写检查库创建一个函数来检查文件的拼写。它的功能是读取文本文件并将其内容发送到拼写检查功能。为了让拼写检查功能正确处理文本,所有换行符都必须替换为空格。我决定为此使用boost。这是我的功能:

spelling check_spelling_file(char *filename, char *dict,  string sepChar)
{

    string line;
    string fileContents = "";
    ifstream fileCheck (filename);
    if (fileCheck.is_open())
    {
        while (fileCheck.good())
            {
                getline (fileCheck,line);
            fileContents = fileContents + line;
        }

        fileCheck.close();
    }
    else
    {
        throw 1;
    }

    boost::replace_all(fileContents, "\r\n", " ");
    boost::replace_all(fileContents, "\n", " ");

    cout << fileContents;

    spelling s;
    s = check_spelling_string(dict, fileContents, sepChar);

    return s;
}

编译库后,我创建了一个带有示例文件的测试应用程序。

测试应用代码:

#include "spellcheck.h"

using namespace std;

int main(void)
{
    spelling s;
    s = check_spelling_file("test", "english.dict",  "\n");

    cout << "Misspelled words:" << endl << endl;
    cout << s.badList;
    cout << endl;

    return 0;
}

测试文件:

This is a tst of the new featurs in this library.
I wonder, iz this spelled correcty.

输出是:

This is a tst of the new featurs in this library.I wonder, iz this spelled correcty.Misspelled words:

This
a
tst
featurs
libraryI
iz
correcty

如您所见,换行符没有被替换。我究竟做错了什么?

4

2 回答 2

5

std::getline从流中提取时不读取换行符,因此它们是较新的写入fileContents.

此外,您不需要搜索和替换"\r\n",流将其抽象出来并将其翻译为'\n'.

于 2013-08-02T19:23:01.587 回答
4

std::getline()从流中提取换行符,但不包含在返回的std::string中,因此没有fileContents要替换的换行符。

此外,请立即检查输入操作的结果(请参阅Why is iostream::eof inside a loop condition thinking wrong?):

while (getline (fileCheck,line))
{
    fileContents += line;
}

或者,要将文件的内容读入 a std::string,请参阅在 C++ 中将整个文件读入 std::string 的最佳方法是什么?然后应用boost::replace_all().

于 2013-08-02T19:23:31.173 回答