[英]C++ - I read a whole file (_which is a list of words separated by 2 white spaces_), how do i get the words separately fast?
[英]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_iterator
的std::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.