只读取文本文件中的字母

时间:2015-12-06 20:58:00

标签: c++ regex

我试图从文本文件中读取一首包含逗号,空格,句点和换行符的诗。我正在尝试使用getline来读取每个单独的单词。我不想读任何逗号,空格,句号或换行符。当我在每个单词中读到时,我正在将每个字母大写,然后调用我的插入函数将每个单词作为单独的节点插入到二进制搜索树中。我不知道分开每个单词的最佳方法。我已经能够用空格分隔每个单词,但是逗号,句号和换行符仍然被读入。

这是我的文本文件:

玫瑰红了, 紫罗兰是蓝色的, 数据结构是最好的, 你和我都知道这是真的。

我使用的代码是:

$(function() {
  $('li a').click(function(e) {
    e.preventDefault();
    $('a').removeClass('active');
    $(this).addClass('active');
  });
});

基本上我使用getline(fin,input,'')来读取我的输入。

3 个答案:

答案 0 :(得分:1)

我能够找到解决方案。我能够将整行代码读入变量行,然后我搜索了单词的每个字母,只保留了一个字母,然后将其存储到word中。然后,我能够调用插入函数来插入节点进入我的树。

const int MAXWORDSIZE = 50;
    const int MAXLINESIZE = 1000;
    char word[MAXWORDSIZE], line[MAXLINESIZE];
    int lineIdx, wordIdx, lineLength;
    //get a line
    fin.getline(line, MAXLINESIZE - 1);
    lineLength = strlen(line);
    while (fin)
    {
        for (int lineIdx = 0; lineIdx < lineLength;)
        {
            //skip over non-alphas, and check for end of line null terminator
            while (!isalpha(line[lineIdx]) && line[lineIdx] != '\0')
                ++lineIdx;

            //make sure not at the end of the line
            if (line[lineIdx] != '\0')
            {
                //copy alphas to word c-string
                wordIdx = 0;
                while (isalpha(line[lineIdx]))
                {
                    word[wordIdx] = toupper(line[lineIdx]);
                    wordIdx++;
                    lineIdx++;
                }
                //make it a c-string with the null terminator
                word[wordIdx] = '\0';

                //THIS IS WHERE YOU WOULD INSERT INTO THE BST OR INCREMENT FREQUENCY COUNTER IN THE NODE
                if (tree.Find(word) == false)
                {
                    tree.Insert(word);
                    totalNodes++;
                    //output word
                    //cout << word << endl;
                }
                else
                {
                    tree.Counter();
                }
            }

答案 1 :(得分:0)

您可以为多个分隔符创建自定义password函数:

getline

并使用它:

std::istream &getline(std::istream &is, std::string &str, std::string const& delims)
{
    str.clear();

    // the 3rd parameter type and the condition part on the right side of &&
    // should be all that differs from std::getline
    for(char c; is.get(c) && delims.find(c) == std::string::npos; )
        str.push_back(c);

    return is;
}

答案 2 :(得分:0)

这是我之前发布过几次的技术的好时机:定义一个ctype facet,除了字母作为空格外,其他所有内容都会被处理(搜索imbue会显示几个例子)。

从那里开始,std::transform在输入端有istream_iterator s,输出有std::set,第一个字母大写为lambda。< / p>