0

テキストデータを含む .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。この問題を回避するには?

4

2 に答える 2

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 つのエントリが含まれ、各エントリは (場合によっては空の) トークンのベクトルになります。

于 2013-06-02T09:14:47.817 に答える