【问题标题】:creating vectors for individually parsed sentences c++为单独解析的句子c ++创建向量
【发布时间】:2014-02-26 05:12:37
【问题描述】:
class Read
{
public:
    Read(const char* filename)
    :mFile(filename)
    {

    }
    void setString()
    {
        while(getline(mFile, str, '.'))
        {
            getline(mFile, str, '.');
            str.erase(std::remove(str.begin(), str.end(), '\n'), str.end());
        }

    }
private:
    ifstream mFile;
    string str;
};


int main()
{
    Read r("sample.txt");
    return 0;
}

我的最终目标是解析文件中的每个句子,因此我使用 getline 将分隔符设置为 '.'得到每个单独的句子。我想创建一个句子向量,但不确定如何做。

文件很大,所以会有很多句子。如何为每个句子创建一个向量?

它会只是向量 str吗?它怎么知道大小?

编辑:我添加了一行代码来删除 '\n' 编辑:摆脱 !eof

【问题讨论】:

  • 它不会知道大小,当您push_back 一个字符串时,如果它的大小不够,向量将为新字符串分配更多内存。
  • 那么,这就是你想要做的吗?显然,你有一个包含所有句子的 vector,而不是“每个句子都有一个 vector”,但如果你真的想要后者,你需要指定分割句子的规则。

标签: c++ parsing vector


【解决方案1】:
while(!myFile.eof())
        getline(mFile, str, '.');

你在哪里找到的?请放回去。试试:

std::vector<std::string> sentences;

while(std::getline(mFile, str, '.'))
    sentences.push_back(str);

vector 容器有一个 .size() 函数来返回填充元素的数量。你应该谷歌“std::vector”并通读 API 中的函数。

【讨论】:

  • 我是从我的教科书中得到的。感谢指正
  • @user3239138:哎呀——这真是可怕eof() 状态仅在尝试某些输入并遇到文件结尾后才在流上设置...假设您的文件包含“abc\n”,那么第一个getline 调用将读取“abc”但eof不会设置,那么第二个getline() 将失败并设置eof()。如果您在调用getline 之前且独立于调用getline 之前测试eof,并且不测试getline 本身是否成功,您将获得第二个getline 调用在文件中找到第二行的错误印象。
【解决方案2】:

向量是动态数组。您不必担心向量的大小。您可以使用push_back() 函数在向量中添加元素。我对您的代码进行了一些更改。请检查这是否适合您..

#include<vector>
using namespace std;
class Read
{
public:
    Read(const char* filename)
    :mFile(filename)
    {

    }
    void setString()
    {
        while(getline(mFile, str, '.'))
        {
            vec.push_back(str);
        }
    }
private:
    ifstream mFile;
    string str;
    vector<string> vec;
};
int main()
{
    Read r("sample.txt");
    return 0;
}

【讨论】:

  • while(!myFile.eof()) 已损坏... eof() 在尝试输入(此处为 getline)并遇到 eof 之前不会设置。对于文本文件,这意味着它仅在尝试读取文件中没有换行符分隔符的最后一行时设置(否则也可能为空)。
  • 我添加了另一行代码来摆脱换行符。应该没问题吧?
【解决方案3】:
#include <vector>
using namespace std;

...

vector<string> sentences;
sentences.push_back(line);

向量是一个动态数组,它会在您不断添加句子时自行调整大小。如果你知道句子的数量,你可以通过调用来提高性能:

sentences.resize(number of sentences here)

【讨论】:

  • 谢谢您的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-14
  • 1970-01-01
  • 2014-11-03
  • 1970-01-01
  • 1970-01-01
  • 2012-03-31
  • 1970-01-01
相关资源
最近更新 更多