用分隔符分隔行以解析文本文件

Split lines by delimiter to parse a text file

本文关键字:文本 文件 分隔符 隔行      更新时间:2023-10-16

我正在写一个程序,它接受一个像这样的txt文件:

foo.txt:

Aaaa/NGACG/NGAA//
Aaab/AGGGC//
Aaac/CTN/AGGC/NNA//

在每一行中,它将ID (Aaa..)存储到一个向量中(每个值存储一次),并将值用/分隔成字符串。

所以第一行是:

    foo.push_back("Aaaa");
    string bar = NGACG;
    foo.push_back("Aaaa");
    string bar2 = NGAA;
伪代码是这样的:
while (not end of file)
{
    while (not end of line)
    {
        while (next char isn't /)
        {
            temporary string x += char
        }
        foo.push_back(string)       //ID
        while (next char isn't /)
        {
            string bar += char      //value
        }
    }
}

我的伪代码显然有缺陷,但这是我想要做的一般想法。我查阅了有关如何解析的指南,但没有什么能真正满足我的目的。我怎样才能做到这一点而又不会完全没有效率呢?如果不使用任意数量的while循环

,我想不出怎么写这个

你可以用传统的C方法处理fgetsstrtok:

char line[SIZE];   // make sure SIZE is greater than your longest input line ...
char *ix;
while(fgets(line), SIZE, fdin) {
    line[strcspn("n")] = ''; // remove EOL
    ix = strtok(line, "/");
    foo.push_back(string(ix));
    string bar = string(strtok(NULL, "/"));
    string bar2 = string(strtok(NULL, "/"));
    ...
}

或者您可以使用带有分隔符参数的stringstreamstd::getline:

string line;
while(getline(fdin, line)) {
    string temp, bar, bar2;
    istringstream is(line);
    getline(is, temp, '/');
    foo.push_back(temp);
    getline(is, bar);
    getline(is, bar2);
    ...
}

当然,您应该添加错误条件的测试…

您可以将行(或整个文件)读取为简单的char数组,并直接使用已读取的行:只需将/替换为'',并将char指针指向下一个char,而无需复制任何内容。null字节终止原始数据中斜杠之间的"值",并且在所有意图和目的中都是自己的C字符串。