2013-01-23 89 views
0

考慮以下方法,從文本文件中讀取一行,並就標記化函數getline:替代標準::需要讀取文件

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的替代實現嗎?

編輯:我在Mac OS X 10.8與gcc-4.7.2。我在SuSE Linux 12.2上用gcc-4.7試過,在那裏崩潰沒有發生。

編輯:一個猜測是,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; 
} 
+1

是在'的std :: string'代碼免費的嗎?什麼是堆棧跟蹤? – sth

+0

「其他系統」? - 目前你的目標系統是什麼?在什麼平臺上不工作? – Caribou

+0

@sth是的。請參閱此處的堆棧跟蹤:https://gist.github.com/4603853 – clstaudt

回答

2

你總是可以編寫自己的慢,簡單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; 
]