我成功编写了代码,将包含文本数据的.dat文件写入1D数组。然而,当我尝试开发我的代码以将这些文件写入2D数组时,我不断陷入指针问题。以下代码是我正在尝试解决的问题:
while (getline(fin, line)) {
char* buf = _strdup(line.c_str());
// parse the line into blank-delimited tokens
int n = 0; // a for-loop index
int s = 0;
int m = 0;
// array to store memory addresses of the tokens in buf
const char* token[MAX_TOKENS_PER_LINE][MAX_TOKENS_PER_LINE] = {};
char *next_token;
// parse the line
token[0][0] = strtok_s(buf, DELIMITER, &next_token); // first token
//token[0] = strtok(buf, DELIMITER); // first token
if (token[0][0]) {
// zero if line is blank
for (n = 1; n < MAX_TOKENS_PER_LINE; n++) {
token[m][n] = strtok_s(0, DELIMITER, &next_token);
//token[n] = strtok(0, DELIMITER);
if (!token[m][n]) break; // no more tokens
m++;
}
}
// process (print) the tokens
for (int i = 0; i < n; i++) // n = #of tokens
for (int j = 0; j<m; j++) {
cout << "Token[" << i << "," << j << "] = " << token[i][j] << endl;
cout << endl;
}
fin.clear();
fin.close();
free(buf);
}
显然在第一行之后,第一个令牌token[0][0]
将指向垃圾,因为不同的数据将在buf
中。如何避免这个问题?
答案 0 :(得分:2)
更好的解决方案可能是使用std::istringstream
和std::getline
进行令牌化:
std::vector<std::vector<std::string>> tokens;
int current_line = 0;
std::string line;
while (std::getline(fin, line))
{
// Create an empty vector for this line
tokens.push_back(std::vector<std::string>());
std::istringstream is(line);
std::string token;
while (std::getline(is, token, DELIMITER))
tokens[current_line].push_back(token);
current_line++;
}
在此之后,tokens
将在文件中每行包含一个条目,并且每个条目将是一个(可能是空的)标记向量。
答案 1 :(得分:0)
您需要“复制”每个令牌,例如
if (token[0][0]) // zero if line is blank
{ token[0][0] = _strdup(token[0][0]);
for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
{ token[m][n] = strtok_s(0, DELIMITER, &next_token);
if (!token[m][n]) break; // no more tokens
token[m][n] = _strdup(token[m][n]);
m++;
}
}
稍后释放令牌数组中的元素。
另外:你正在释放文件末尾的buf
指针,你需要为每一行释放它 - 实际上,使用上面的逻辑,你不需要调用{{1对于_strdup()
,它可以只是buf