矢量<字符*> push_back 覆盖所有条目

Vector<char*> push_back overwrites all entries

本文关键字:覆盖 back push 字符 lt gt 矢量      更新时间:2023-10-16

我想使用push_back函数用文本文件中的行填充向量。但它会用最后一行覆盖所有条目。这是源代码:

  int main() {
    std::vector<char*> lines;
    FILE* file;
    file = fopen("textfile.txt", "r");
    const size_t max_line_length = 1000;
    char line[max_line_length + 1];
    while ( !feof(file)) {
      fgets(line, max_line_length, file);
      lines.push_back(line);
    }
    fclose(file);
 }

希望有人能帮忙。

您正在覆盖Line,这实际上是您存储的唯一内容,因为您从不进行深度复制。试试这个:

int main() {
    std::vector<std::string> lines; // <- change this!
    FILE* file;
    file = fopen("textfile.txt", "r");
    const size_t max_line_length = 1000;
    char line[max_line_length + 1];
    while ( !feof(file)) {
      fgets(line, max_line_length, file);
      lines.push_back(line);
    }
    fclose(file);
 }

您正在将相同的缓冲区(line)推入向量的每个位置。您需要:

  1. 使用new为每行重新分配一个新的char*
  2. 使用strdup在每行复制line缓冲区
  3. 按照@menniumbug的建议使用std::string(我最喜欢)