如何在C ++中使用多个分隔符正确解析文本文件?

时间:2017-11-11 09:38:01

标签: c++ file parsing io delimiter

我必须将带有段落的输入文件解析成句子。输出中的每一行对应一个句子。这大部分是正确的,但我无法得到理想的结果。

我被要求使用的分隔符是:

  • "
  • "

测试输入: 第一个故事是关于连接点。

我在最初的6个月后退出了里德学院,但在我真正退出之前,我又待了18个月左右。那我为什么要退学呢?

它始于我出生之前。我的亲生母亲是一名年轻的,未婚的大学毕业生,她决定让我收养。她非常强烈地感到我应该被大学毕业生收养,所以我的一切都是为了让我在出生时被律师和他的妻子收养。除了当我突然出现时他们在最后一分钟决定他们真的想要一个女孩。所以我的父母,他们在等候名单上,在半夜接到电话询问:"我们有一个意外的男婴;你想要他吗?"他们说:"当然。"我的亲生母亲后来发现,我母亲从未大学毕业,父亲从未高中毕业。她拒绝签署最终的收养文件。几个月后,当我父母答应我有一天会上大学时,她才心软了。

#include "FileIOs_WordPairs.h"
#include <fstream>
#include <sstream>
#include <vector>



using namespace std;
bool sentenceSplitter(string& fname, vector<string>& sentences)
{
    ifstream file;
    string temp;
    size_t pos = 0;

    string token;

    file.open(fname);
    if (file.fail())
    {
        cerr << "Failed to open the file" << endl;
        return(-1);
    }

    while (getline(file, temp))
    {
        istringstream iss(temp);

        while ((pos = temp.find_first_of(".")) != string::npos)
        {
            token = temp.substr(0, pos);
            if (token.length() != 0)
                cout << token << endl;
            temp = temp.substr(pos + strlen("."));
        }

        while ((pos = temp.find_first_of("?")) != string::npos)
        {
            token = temp.substr(0, pos);
            if (token.length() != 0)
                cout << token << endl;
            temp = temp.substr(pos + strlen("?"));
        }

        while ((pos = temp.find_first_of(".\"")) != string::npos)
        {
            token = temp.substr(0, pos);
            if (token.length() != 0)
                cout << token << endl;
            temp = temp.substr(pos + strlen(".\""));
        }

        while ((pos = temp.find_first_of("?\"")) != string::npos)
        {
            token = temp.substr(0, pos);
            if (token.length() != 0)
                cout << token << endl;
            temp = temp.substr(pos + strlen("?\""));
        }
    }

}

预期产出:

  • 第一个故事是关于连接点
  • 我在前6个月后退出了里德学院,但在我真正退出之前又呆了18个月左右。
  • 那我为什么要退学
  • 在我出生之前就开始了
  • 我的亲生母亲是一名年轻的,未婚的大学毕业生,她决定让我收养
  • 她非常强烈地感到我应该被大学毕业生收养,所以一切都准备让我在出生时被律师和他的妻子收养
  • 除了当我突然出现时他们在最后一分钟决定他们真的想要一个女孩
  • 所以我的父母,他们在等候名单上,在半夜接到电话询问:&#34;我们有一个意想不到的男婴;你想要他吗
  • 他们说:&#34;当然
  • 我的亲生母亲后来发现我母亲从未大学毕业,父亲从未高中毕业
  • 她拒绝签署最终收养文件
  • 几个月后,当我的父母答应我有一天会上大学时,她才心软了。

当前输出:

  • 第一个故事是关于连接点
  • 我在前6个月后退出了里德学院,但在我真正退出之前又呆了18个月左右。
  • 那我为什么要退学
  • 在我出生之前就开始了
  • 我的亲生母亲是一名年轻的,未婚的大学毕业生,她决定让我收养
  • 她非常强烈地感到我应该被大学毕业生收养,所以一切都准备让我在出生时被律师和他的妻子收养
  • 除了当我突然出现时他们在最后一分钟决定他们真的想要一个女孩
  • 所以我的父母,他们在等候名单上,在半夜接到电话询问:&#34;我们有一个意想不到的男婴;你想要他吗?&#34;他们说:&#34;当然
  • &#34;我的亲生母亲后来发现我母亲从未大学毕业,父亲从未高中毕业
  • 她拒绝签署最终收养文件
  • 几个月后,当我的父母答应我有一天会上大学时,她才心软了。

简单地说,我无法找到使用方法。&#34;和?&#34;作为分隔符

1 个答案:

答案 0 :(得分:0)

使用boost库很容易:

#include <iostream>
#include <string>
#include <boost/algorithm/string/regex.hpp>

int main()
{
    using namespace std;
    vector< string > results;
    std::string text = "Hi! How are you?? Today is a nice day.";
    boost::algorithm::split_regex( results, text, boost::regex( "\\!|\\.|\\?\\?" ) ) ;
    for(string sentence:results)
        std::cout << "[" << sentence << "]" << std::endl;
}

编译:

g++ -std=c++11 main.cpp -lboost_regex  && ./a.out

结果:

[Hi]
[ How are you]
[ Today is a nice day]
[]