如果该行包含特定单词 (C++),请打印该行

Print the line if it contains a specific word (C++)

本文关键字:打印 C++ 单词 包含特 如果      更新时间:2023-10-16

我注意到一个用户有类似的问题,但他们是用python编写的,我正在尝试找出一个c ++解决方案。

目前正在编写拼写检查器,如果文件包含特定字符串,我正在尝试打印文件中的行。我认为getline()函数对解决方案很有用,但我不太确定如何在我的情况下使用它。

 ifstream inputFileIn(inputFilename);
  list inputFile;
  string word;
  while (inputFileIn >> word)
    {
      transform(word.begin(), word.end(), word.begin(), ::tolower); //convert words to lowercase to spellcheck
      //remove punctuation from the word
      for (int i = 0; i < word.length(); i++)
        {
          if (ispunct(word[i]))
            {
              word.erase(i--, 1);       
            }
        }
      //if spelled incorrectly 
      if (!wordList.contains(word) && std::string::npos == word.find_first_of("0123456789,:;.!?-() ") && word != "n")
        {
          inputFile.add(word, 0);
        }
    }

因此,如果word在行中,它将打印出共享该行的所有其他单词。我并不是真的在寻找某人来做这件事,但我需要弄清楚如何使用getline()

编辑:

感谢您的回复。我目前正在使用这个

      if (!wordList.contains(word) && std::string::npos == word.find_first_of("0123456789,:;.!?-() ") && word != "n")
        {
          string line;
          while (getline(inputFileIn, line))
            {
              if (line.find(word))
                {         
                  cout << "Line is: " << line << 'n' << "Word is: " << word << endl;
                }
            }
          inputFile.add(word, 0);
        }
    }

但是出于某种原因,if (line.find(word))总是返回true,即使我这样做if (line.find("....."))这显然不包含在该行中。

您确实可以使用getline一次读取一行:

std::string line;
while (std::getline(inputFileIn, line))
{
    ...
要检查特定单词,

如果您想检查单词边界,忽略大小写和标点符号,处理带连字符的单词和其他奇怪情况,您可能会发现使用正则表达式提取每个单词最容易,然后查看它们是否在您的单词列表中。 否则,如果您的单词列表很短,您可以使用 std::string::find 依次搜索行中的每个条目,但如果单词列表很长,这将效率低下,您需要从行中提取候选单词。 这可以粗略地完成:

std::istringstream iss{line};
while (line >> word)
{
    ...transform / remove punctuation etc...