0

我成功编写了将包含文本数据的 .dat 文件写入一维数组的代码。但是,当我尝试开发代码以将这些文件写入二维数组时,我一直陷入指针问题。以下代码是我要修复的:

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. 如何避免这个问题?

4

2 回答 2

2

更好的解决方案可能是使用std::istringstreamstd::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文件中的每一行将包含一个条目,并且每个条目将是一个(可能为空的)标记向量。

于 2013-06-02T09:14:47.817 回答
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文件末尾的指针,你需要为每一行释放它——实际上,按照上面的逻辑,你不需要调用_strdup()for buf,它可以是char* buf = line.c_str();

于 2013-06-02T08:37:55.390 回答