我正在尝试阅读文件。文件内容在句子中的单词和句子之间的两个换行符之间有换行符。我只能读一句话。我试图将EOF作为分隔符放在getline中,但它似乎不起作用。有没有人对如何解决这个问题有任何建议?
文件内容为:
县
盛大
评委
周五对亚特兰大近期初选的调查表示 选举产生``。没有证据'' 。任何
发生了违规行为。 。陪审团进一步表示 城市执行委员会提交的期末报告但是打印的是:
县
大陪审团星期五对亚特兰大的调查表示 最近的初选产生了``。没有证据'' 。那 发生任何违规行为 。 。
string line;
string a, b;
ifstream infile("myFile");
while (getline(infile, line))
{
istringstream iss(line);
if (!(iss >> a >> b)) { break; } // error
cout << a << b << endl;
}
答案 0 :(得分:0)
#include <iostream>
#include <vector>
#include <boost/tokenizer.hpp>
using namespace std;
typedef boost::tokenizer<boost::char_separator<char>,
std::istreambuf_iterator<char> >
tokenizer;
void printPhrase(const vector<string>& _phrase) {
if (!_phrase.empty()) {
vector<string>::const_iterator it = _phrase.begin();
cout << "Phrase: \"" << *it;
for(++it; it != _phrase.end(); ++it)
cout << "\", \"" << *it;
cout << "\"" << endl;
} else
cout << "Empty phrase" << endl;
}
int main() {
boost::char_separator<char> sep("", "\n", boost::drop_empty_tokens);
istreambuf_iterator<char> citer(cin);
istreambuf_iterator<char> eof;
tokenizer tokens(citer, eof, sep);
int eolcount = 0;
vector<string> phrase;
for (tokenizer::iterator it = tokens.begin(); it != tokens.end(); ++it) {
if (*it == "\n") {
eolcount ++;
if (eolcount > 1 && eolcount % 2 == 0) { // phrase end
printPhrase(phrase);
phrase.clear();
}
} else {
eolcount = 0;
phrase.push_back(*it);
}
}
if (!phrase.empty())
printPhrase(phrase);
return 0;
}
基本思想是在输出中保留换行符,对它们进行计数,如果有2个,4个......偶数个连续换行符打印到目前为止收集的单词。非换行令牌会中断序列,此令牌将添加到累加器中。