矢量值分配

时间:2012-05-08 23:52:56

标签: c++ file vector

我有这段代码:

    while(fileStream>>help)
    {
        MyVector.push_back(help);
    }

...并且让我们说文件“fileStream”是1句:今天是晴天。现在当我这样做时:

    for(int i=0;i<MyVector.size();i++)
    {
         printf("%s\n", MyVector[i]);
    }

,重新开始是“日日活动日”。而且,当然,它应该是那样的。变量声明如下:

    char *help;
    vector<char*> MyVector;
编辑:我理解答案,谢谢......但是有没有办法在vector<char*> MyVector中存储文件中的文字(就像我想要的那样)。这对我的其他计划来说会很棒。

2 个答案:

答案 0 :(得分:6)

当你执行fileStream>>help时,它不会改变指针的值,它会覆盖指针所指向的字符串的内容。所以你一遍又一遍地将同一个指针推入向量。因此,向量中的所有指针都指向相同的字符串。因为写入该字符串的最后一件事是“day”这个词,所以当你打印出vector的每个元素时,这就是你得到的。

使用std::string的向量代替:

string help;
vector<string> MyVector;

如果如你所说,你必须坚持使用vector<char*>,那么你必须为每个元素动态分配一个新的字符串。您无法安全地将char*operator>>一起使用,因为无法告诉它您的字符串中实际有多少空间,因此我将至少使用std::string作为输入。

std::string help;
vector<char*> MyVector;

while (fileStream>>help) {
    char * p = new char[help.size() + 1];
    strcpy(p, help.c_str());
    MyVector.push_back(p);
}

当然,当你完成向量时,你不能让它超出范围。您需要在循环中手动删除每个元素。但是,这仍然不是完全安全的,因为您的内存分配可能会抛出异常,导致您已分配的任何字符串并放入向量中泄漏。所以你应该把它全部包装在try块中并准备好捕获std::bad_alloc

这很麻烦。如果你能解释为什么你认为你需要使用vector<char*>,我打赌有人可以告诉你为什么你不这样做。

答案 1 :(得分:3)

那是因为你的char *都指向同一个对象。 help指针和存储在向量中的指针都指向同一个对象。每次从流中读取时,它都会修改所有指针指向的内容。将char*更改为std::string