1

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

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

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

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

因此,简单地说:有没有一种简单的方法可以从文件中读取输入并将其拆分为单词?

4

4 回答 4

3

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

IE

std::ifstream file("filename");
std::vector<std::string> words;
std::string currentWord;
while(file >> currentWord)
    words.push_back(currentWord);
于 2010-09-12T02:10:46.083 回答
3

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

#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';
}

std::string参数告诉它在你做的时候返回istream_iteratora 。每次迭代器递增时,它都会从其流中获取另一个单词。string*word_iter

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

于 2010-09-12T02:11:30.747 回答
0

您可以将 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)。

于 2010-09-12T02:11:20.667 回答
0

您可以使用扫描仪技术来抓取单词、数字日期等……非常简单灵活。扫描器通常将标记(单词、数字、实数、关键字等)返回给解析器。

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

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

于 2010-09-12T02:56:28.447 回答