1

テキストファイルから行を読み取り、トークン化する次の方法について考えてみます。

std::pair<int, int> METISParser::getHeader() {

    // handle header line
    int n;  // number of nodes
    int m;  // number of edges

    std::string line = "";
    assert (this->graphFile);
    if (std::getline(this->graphFile, line)) {
        std::vector<node> tokens = parseLine(line);
        n = tokens[0];
        m = tokens[1];
        return std::make_pair(n, m);
    } else {
        ERROR("getline not successful");
    }

}

でクラッシュが発生しますstd::getlinepointer being freed was not allocated-ここでは詳細については説明しません)。他のシステムでコードをコンパイルしてもクラッシュは発生せず、自分のコードのエラーではない可能性が非常に高くなります。今のところ私はこれを修正することができず、時間がないので、あなたの助けを借りてそれを回避しようとします:

を使用しない代替実装を提案できますstd::getlineか?

編集:私はgcc-4.7.2を搭載したMac OSX10.8を使用しています。クラッシュが発生しないgcc-4.7を使用してSuSELinux12.2を試してみました。

編集:1つの推測はparseLine、文字列を破損することでした。完全を期すためのコードは次のとおりです。

static std::vector<node> parseLine(std::string line) {

    std::stringstream stream(line);
    std::string token;
    char delim = ' ';
    std::vector<node> adjacencies;

    // split string and push adjacent nodes
    while (std::getline(stream, token, delim)) {
        node v = atoi(token.c_str());
        adjacencies.push_back(v);
    }

    return adjacencies;
}
4

1 に答える 1

4

あなたはそれを機能させるために、いつでもあなた自身のより遅くてより簡単なものを書くことができますgetline

istream &diy_getline(istream &is, std::string &s, char delim = '\n')
{
    s.clear();
    int ch;
    while((ch = is.get()) != EOF && ch != delim)
        s.push_back(ch);
    return is;
]
于 2013-01-23T10:21:59.243 に答える