用制表符分隔的文本填充字符串向量

c++ file vector tabs delimited

239 观看

2回复

我是C ++的新手。

我正在尝试使用制表符分隔文件中的元素填充向量。最简单的方法是什么?

谢谢!

作者: AishaAJ 的来源 发布者: 2019 年 10 月 27 日

回应 (2)


0

可能有很多方法可以做到,简单的Google搜索为您提供了解决方案。

这是我的一个项目的例子。它使用getline和读取逗号分隔文件(CSV),我让您更改它以读取制表符分隔的文件。

ifstream fin(filename.c_str());
string buffer;

while(!fin.eof() && getline(fin, buffer))
{
    size_t prev_pos = 0, curr_pos = 0;
    vector<string> tokenlist;
    string token; 
    // check string
    assert(buffer.length() != 0);

    // tokenize string buffer.
    curr_pos = buffer.find(',', prev_pos);

    while(1) {

        if(curr_pos == string::npos)
            curr_pos = buffer.length();

        // could be zero
        int token_length = curr_pos-prev_pos;

        // create new token and add it to tokenlist.
        token = buffer.substr(prev_pos, token_length);
        tokenlist.push_back(token);

        // reached end of the line
        if(curr_pos == buffer.length())
            break;

        prev_pos = curr_pos+1;
        curr_pos = buffer.find(',', prev_pos);
    }
}

更新:改善了条件。

作者: vcp 发布者: 04.03.2016 02:06

0

这可能是最简单的方法,但是vcp的方法可能更有效。

std::vector<string> tokens;
std::string token;
while (std::getline(infile, token, '\t')
{
    tokens.push_back(token);
}

做完了 实际上,您可以使用输入迭代器反向插入器将其简化为大约三行代码,但是为什么呢?

现在,如果将文件切成几行并用这些行上的制表符分隔,则还必须处理行定界符。现在,您只需执行两次以上操作,一个循环行,一个内部循环来解析选项卡。

std::vector<string> tokens;
std::string line;
while (std::getline(infile, line)
{
    std::stringstream instream(line)
    std::string token;
    while (std::getline(instream, token, '\t')
    {
        tokens.push_back(token);
    }
}

如果您需要做线,然后是制表符,那么...我不知道...引用吗?三个循环。但是老实说,我可能正在三点编写一个状态机。我怀疑您的老师在现阶段想要这样的事情。

作者: user4581301 发布者: 04.03.2016 02:43
32x32