【问题标题】:How to read a file and get words in C++如何在 C++ 中读取文件并获取单词
【发布时间】:2010-09-12 02:05:27
【问题描述】:

我很好奇如何逐字读取没有固定结构的文本文件(例如笔记或小报告)的输入。 例如,文本的结构可能如下:

“1992 年 6 月 5 日
今天是个好日子;
虫子转身,战斗胜利了。”

我在想也许可以使用 getline 获取该行,然后查看是否可以从那里通过空格将其拆分为单词。然后我认为使用 strtok 可能会起作用!但是我认为这不适用于标点符号。

我正在考虑的另一种方法是逐个字符地获取所有字符并省略不需要的字符。然而,这似乎不太可能。

所以要简短地排序: 有没有一种简单的方法可以从文件中读取输入并将其拆分为单词?

【问题讨论】:

  • 感谢您的解决方案。都会尝试一下!

标签: c++ file-io word


【解决方案1】:

因为写起来比找重复的问题容易,

#include <iterator>

std::istream_iterator<std::string> word_iter( my_file_stream ), word_iter_end;

size_t wordcnt;
for ( ; word_iter != word_iter_end; ++ word_iter ) {
    std::cout << "word " << wordcnt << ": " << * word_iter << '\n';
}

istream_iteratorstd::string 参数告诉它在您执行 *word_iter 时返回 string。每次迭代器递增时,它都会从其流中抓取另一个单词。

如果您在同一流上同时有多个迭代器,您可以选择要提取的数据类型。但是,在这种情况下,直接使用&gt;&gt; 可能更容易。迭代器的优点是它可以插入到&lt;algorithm&gt; 中的泛型函数中。

【讨论】:

  • +1 用于istream_iterator 解决方案——尽管我确实注意到这对初学者来说可能不是最好的:)
  • @Billy:嗯,我不知道。我认为迭代器比容器更基础,许多初学者都忽略了它们,直到他们已经有了可以在任何地方通过vector 的代码体时才学习。
  • @wilhelmtell:您将如何使用std::copy 复制上述内容? for 内部似乎有更复杂的逻辑,而不仅仅是复制......
  • 哎呀,我应该通读一遍。请原谅西部最快的枪不能瞄准。
  • @Trygle:不,我应该解释一下。所以现在我做到了。
【解决方案2】:

是的。您正在寻找std::istream::operator&gt;&gt; :) 请注意,它会删除连续的空格,但我怀疑这是一个问题。

std::ifstream file("filename");
std::vector<std::string> words;
std::string currentWord;
while(file >> currentWord)
    words.push_back(currentWord);

【讨论】:

  • 说实话,这种做法我什至没有想到。 +1
  • 我喜欢这个。我需要突破我的 Vector 安全区,所以 PotatoSwatter 的解决方案给了我最好的学习体验。当所有这些都适合我的问题时,很难选择解决方案。
【解决方案3】:

您可以使用带有空格字符的 getline,getline(buffer,1000,' ');

或者也许您可以使用此函数将字符串拆分为多个部分,并带有一定的分隔符:

string StrPart(string s, char sep, int i) {
  string out="";
  int n=0, c=0;
  for (c=0;c<(int)s.length();c++) {
    if (s[c]==sep) {
      n+=1;
    } else {
      if (n==i) out+=s[c];
    }
  }
  return out;
}

注意:这个函数假定你已经声明了using namespace std;

s 是要拆分的字符串。 sep 是分隔符 i 是要获取的部分(基于 0)。

【讨论】:

  • 为什么不在这里使用std::getline(std::istream&amp;, std::string&amp;)?哦,nc 是可怕的变量名。
  • 对于一个非常短的函数,那些变量名就可以了。
  • -1 用于可怕的格式。空格有助于可读性,可解析的变量名也是如此。 (变量的范围越广,它的名字就应该越“好”。函数范围的变量应该至少是一个词。)
【解决方案4】:

您可以使用扫描仪技术来抓取单词、数字日期等...非常简单和灵活。扫描器通常会将令牌(单词、数字、实数、关键字等)返回给 Parser。

如果您以后打算解释这些词,我会推荐这种方法。

我可以热烈推荐 Ronald Mak(Wiley Computer Publishing)的《Writing Compilers and Interpreters》一书

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2019-06-27
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    相关资源
    最近更新 更多