我正在尝试读取文件。 文件内容在句子中的单词之间有一个换行符,在句子之间有两个换行符。 我只能读一句话。 我试图将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;
}

===============>>#1 票数: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,..偶数个连续换行符,则会打印出单词。 非换行标记会破坏序列,并且此标记会添加到累加器中。

  ask by Carnez translate from so

未解决问题?本站智能推荐:

1回复

C ++ EOF Getline错误

我正在使用其中一个相关问题中使用的表格。 唯一的问题是,我一直在文件结尾处保持正确。 该文件是fstream,str是字符串。 未处理的异常Microsoft C ++异常:std :: ios_base :: failure
2回复

getline设置failbit以及eof

我知道这种行为的起源,因为它在SO中的多个帖子中得到了很好的解释,一些值得注意的例子是: 为什么循环条件中的iostream :: eof被认为是错误的? 使用getline()而不设置failbit 当它击中eof时std :: getline投掷 C ++ istre
4回复

std :: getline和eol与eof

我有一个程序正在跟踪不断增长的文件。 我试图避免从文件中抓取部分行(例如,在其他进程完全写完该行之前先进行读取。)我知道它正在我的代码中发生,因此我试图专门捕获它。 有理智的方法吗? 这是我正在尝试的: 但是,我无法轻松重现该问题,因此不确定使用此代码检测到它。 st
4回复

c ++ getline()和文件EOF

这个问题困扰了我一晚。谢谢! 这段代码会将文件中的最后一行写入两次.WHY? infile.getline(str,strSize); str是NULL ,如果没有修改str,为什么是null? 但在if(sequenceNum>469) , str成为最后一行。
2回复

在string :: getline中检查eof

如何使用std::getline函数检查文件结尾? 如果我使用eof()也不会发出信号eof ,直到我试图读取超出档案结尾。
3回复

上线并立即测试EOF

我想问一下我试图阅读Getline和EOF问题但没有帮助的问题。 问题是我不知道在哪里可能会出错:使用的函数(getline或检查EOF)是否存在问题? 如果text.txt文件中没有文本,则说明已找到内容。 但是我不知道为什么或在哪里犯了错误... 我想要的是:搜索字符串,
1回复

EOF在ifstream中突然到达getline()

我有包含2个字符串的文件“ in.txt”: 我有我的代码: 注释代码: ( 1. )第一个符号'a'被get()稍稍超过了; 因此,这里读取了下一个2个符号,我想读取的第3个符号getline()自动分配了值'\\ 0'(如果我理解正确的话)。 ( 2. )这是一
5回复

如何检查EOF(使用getline之后)

请参阅下面的更新! 我的代码(现在我包括了更多): 我希望这个问题有道理! 谢谢 马库斯 更新:重新编写代码。 告诉它删除1个任务后,它将永远不会运行此循环。 当前代码: } 输入文件: 输出文件(告诉它删除test1和2后):
1回复

当它击中eof时std :: getline投掷

std::getline获得eof时抛出异常。 这就是我的表现。 在上面的代码中, getline会因为eof而抛出异常如何处理这种情况? 编辑
3回复

将EOF与Getline的字符缓冲区分开

我正在使用getline从输入文件中提取缓冲区中的字符。 读完一行后,我遍历所有字符并在地图上进行查找(以进行一些其他操作)。 问题在于,一旦有效字符结束,我的程序就会从输入流中获取eof并尝试在地图中查找它。 我尝试检查inputStream.eof()或eofbit ,以查看何时到