考虑以下方法,该方法从文本文件中读取一行并对其进行标记:
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::getline
发生了崩溃(pointer being freed was not allocated
- 此处不再详述)。 如果我在其他系统上编译我的代码并且很可能在我自己的代码中没有错误,那么崩溃就不会发生。目前我无法解决这个问题,而且我没有时间,所以我会尽力绕过它:
您能否提出一个不使用std::getline
的替代实现?
编辑:有人猜测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;
}
答案 0 :(得分:3)
您可以随时编写自己较慢且更简单的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;
]