通过分隔符拆分行来解析文本文件

时间:2015-10-02 09:12:38

标签: c++ csv

我正在编写一个带有这样的txt文件的程序:

foo.txt的:

increment()

在每一行中,它将ID(Aaa ..)存储到一个向量中(每个值一次),以及由/分隔的值。

所以第一行是:

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

伪代码是这样的:

    foo.push_back("Aaaa");
    string bar = NGACG;
    foo.push_back("Aaaa");
    string bar2 = NGAA;

我的伪代码显然存在缺陷,但这就是我想要做的一般想法。我查阅了如何解析的指南,但没有什么能真正起作用。如何在不完全低效的情况下做到这一点?我不记得如何在不使用任意数量的while循环的情况下编写它

2 个答案:

答案 0 :(得分:1)

你可以使用fgetsstrtok好的旧C方式

char line[SIZE];   // make sure SIZE is greater than your longest input line ...
char *ix;
while(fgets(line), SIZE, fdin) {
    line[strcspn("\n")] = '\0'; // 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);
    ...
}

当然,您应该为错误条件添加测试...

答案 1 :(得分:0)

您可以将行(或整个文件)读入简单的char数组并使用您直接读取的行:只需将/替换为'\0',并将指向下一个字符的char指针指向很线,没有复制任何东西。空字节终止原始数据中斜杠之间的“值”,并且是所有意图和目的的C字符串。