从文件中读取单词并将其存储在向量c ++中

时间:2016-03-21 12:23:47

标签: c++ vector fgets

void print(vector<const char*> v) {
    for (vector<const char*>::const_iterator i = v.begin(); i != v.end(); ++i)
        cout << *i << ' ';
    cout << endl;
}
int main()
{
    vector<const char*> v;
    FILE *infile;
    infile = fopen("Text.txt", "r");
    char buffer[100];
    while ((fgets(buffer, 100, infile) != NULL)) {
        if (buffer[strlen(buffer) - 1] == '\n')
            buffer[strlen(buffer) - 1] = '\0';
        v.push_back((const char*)buffer);
        printf("%s\n", buffer);
    }
    fclose(infile);
    print(v);
return 0;

}

所以这就是我到目前为止所拥有的。在printf(在while循环中),正确打印文件中的单词。但是函数print(打印向量的元素)只显示了文件中单词数重复的最后一个单词。例如,让我说我的文件中有这个:

apple
banana
orange

打印功能将打印:

orange
orange
orange

编辑:所以我设法让这个工作。我列出了#34;缓冲区&#34;它现在正常工作。谢谢大家的帮助!

2 个答案:

答案 0 :(得分:3)

问题是你在同一个数组push_back上调用buffer,每次都将相同的指针存储到向量中的初始元素。

这意味着,除了其他内容之外,无论您在调用buffer之前或之后放入push_back的内容,vector元素都会指向它。在您的情况下,结果是您看到了您已阅读的最后一个元素,但如果您在读取文件后写入buffer,则向量将显示该新值。

为了解决这个问题,您需要推回缓冲区的副本,而不是推送缓冲区本身。 C ++中的首选方法是从vector<const char*>切换到vector<string>,因为字符串使复制和资源管理变得更加容易。

如果必须使用指针,请使vector存储非常量指针;否则你就无法打电话给delete。在调用buffer之前,不要将strlen(buffer)+1 char new[]分配给strcpybuffer分配push_back

答案 1 :(得分:1)

由于已经发布了实际答案,因此print()函数可以使用一些改进:

void print(vector<const char*> const & v) {
    for (auto const chp : v) {
        cout << chp << ' ';
    }
    cout << '\n';
}

此版本采用引用而不是复制整个向量。因为向量不会被print()更改为const

此外,如果您想迭代容器的所有元素,则不必手动管理迭代器。