繁体   English   中英

如何使用C ++读取文件并获取单词

[英]How to read a file and get words in C++

我很好奇我将如何逐字逐句地从没有设置结构(例如注释或小报告)的文本文件中读取输入。 例如,文本的结构可能如下所示:

“ 1992年5月6日
今天是个好日子;
蠕虫变了,战斗赢了。”

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

我想到的另一种方法是通过char获得所有char并省略不需要的字符。 然而,那似乎不太可能。

因此,简而言之:是否有一种简单的方法可以从文件中读取输入并将其拆分为单词?

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

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

由于写起来比找到重复的问题容易,

#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 每当迭代器递增时,它就会从其流中获取另一个单词。

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

您可以将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;声明了该函数using namespace std;

s是要分割的字符串。 sep是定界符, i是要获取的部分(基于0)。

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

如果您以后打算解释这些词,我建议您使用这种方法。

我可以热烈推荐Ronald Mak(Wiley Computer Publishing)的著作《编写编译器和口译员》

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM