1
vector<string> wordstocheck;
in.open("readin.txt");

string line;
string word = "";
int linecount = 0;


while (getline(in, line))
{
    //cout << line << endl;
    for (int i = 0; i < line.size(); i++)
    {
        if(isalpha(line[i]))
        {
            word.push_back(tolower(line[i]));
        }
        else if (line[i] == ' ' || ispunct(line[i]) || line[i] == '\n')
        {
            wordstocheck.push_back(word);
            word = "";
        }

    }

linecount++;
}
for (int i = 0; i < wordstocheck.size(); i++)
    {
        cout << wordstocheck[i] << endl;
    }
system("pause");
}

上面的代码从 .txt 文件中读取以下内容:

 If debugging is the
 process of removing bugs.
 Then programming must be the
 process of putting them in.

我试图让程序识别每个单词,并将单个单词保存到向量中,然后打印出单词向量。除了第一行和第三行的两个'the'之外,它做得很好。

Output:
if
debugging
is
theprocess
of
removing
bugs
then
programming
must
be
theprocess
of
putting
them
in
Press any key to continue . . .

它并没有像我希望的那样分裂“过程”。

4

4 回答 4

3

getline不会阅读换行符。但是,在这种情况下,解决此问题相对简单。

在您当前拥有的地方linecount++;,在它之前添加以下行:

   if (word != "")
   {
        wordstocheck.push_back(word);
        word = "";
   }

您可能希望在推到if (word != "")的第一个位置使用相同的内容,因为如果文本有“A Word”,您将添加单词“A”,后跟一个空单词,因为秒空间会触发该单词添加到列表中。wordwordstocheck

作为替代方案,您可以摆脱 getline,只使用int ch = in.get()从输入中一次读取一个字符。然后不是在 , 中计算行数,而是在循环中while()...使用ch而不是line[i]al,然后在该else if部分内添加第二个 if,它检查换行符并计算行数。这可能会使代码更短。

于 2013-06-28T23:58:31.027 回答
1

我相信问题在于您期望换行符包含在结果中getline(),但事实并非如此。似乎如果您采用该块中已有的两行:

wordstocheck.push_back(word);
word = "";

并将它们添加到行旁边:

linecount++;

然后它应该按您的预期工作。

于 2013-06-28T23:58:00.353 回答
0

如果您想一次阅读一个单词,为什么std::getline首先要使用?

// read the words into a vector of strings:
std::vector<std::string> words{std::istream_iterator<std::string(in),       
                           std::istream_iterator<std::string()};

您可以使用std::for_eachorstd::transform将所有内容转换为小写,最后打印出来for (auto const &w : words) std::cout << w << "\n";

于 2013-06-29T03:23:33.950 回答
0

到目前为止,我知道,getline 读取整行并且不识别回车符。我知道的唯一方法是读取文件,逐个字符地读取它。这是一个给出正确结果的示例:

#include <iostream>     // std::cin, std::cout
#include <fstream>      // std::ifstream

int main ()
{
    char str[256];
    int line = 1;
    int charcount = 0;

    std::cout << "Enter the name of an existing text file: ";
    std::cin.get (str,256);

    std::ifstream is(str);
    if (!is)
    {
        std::cerr << "Error opening file!" << std::endl;
        return -1;
    }

    char c;
    while ((c = is.get()) && is.good()) // loop while extraction from file if possible
    {
        if (c == 10 || c == 13 || c == 32) // if it is a line break or carriage return or space
        {
            std::cout << std::endl;
            line++;
        }
        else // everything else
        {
            std::cout << c;
            charcount++;
        }
    }
    is.close();
    std::cout << std::endl;                // close file
    std::cout << line << " lines" << std::endl;
    std::cout << charcount << " chars" << std::endl;

    return 0;
}
于 2013-06-29T12:30:45.410 回答