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;它现在正常工作。谢谢大家的帮助!
答案 0 :(得分:3)
问题是你在同一个数组push_back
上调用buffer
,每次都将相同的指针存储到向量中的初始元素。
这意味着,除了其他内容之外,无论您在调用buffer
之前或之后放入push_back
的内容,vector
元素都会指向它。在您的情况下,结果是您看到了您已阅读的最后一个元素,但如果您在读取文件后写入buffer
,则向量将显示该新值。
为了解决这个问题,您需要推回缓冲区的副本,而不是推送缓冲区本身。 C ++中的首选方法是从vector<const char*>
切换到vector<string>
,因为字符串使复制和资源管理变得更加容易。
如果必须使用指针,请使vector
存储非常量指针;否则你就无法打电话给delete
。在调用buffer
之前,不要将strlen(buffer)+1
char
new[]
分配给strcpy
,buffer
分配push_back
。
答案 1 :(得分:1)
由于已经发布了实际答案,因此print()函数可以使用一些改进:
void print(vector<const char*> const & v) {
for (auto const chp : v) {
cout << chp << ' ';
}
cout << '\n';
}
此版本采用引用而不是复制整个向量。因为向量不会被print()
更改为const
。
此外,如果您想迭代容器的所有元素,则不必手动管理迭代器。