我想在c ++中迭代字符串向量。我想用fopen打开列表中的每个项目。
const char *filep //fopen needs a constant char pointer.
for (vector<string>::iterator it = filelist.begin(); it != filelist.end(); it++)
{
filep = (const char *)it; //This isn't working. How can I fix this
fopen(filep, "rb");
}
答案 0 :(得分:6)
您应该使用it->c_str()
因为it
本质上是{em>指针到std::vector
中的元素。但为了更轻松的生活使用
for (const auto& s : filelist){
// s is a const reference to an element in filelist
// use s.c_str() if you need the character buffer
}
从C ++ 11开始,这是有效的。使用const auto&
而不是auto
可以避免std::string
副本。
答案 1 :(得分:2)
改变这个:
"Always"
到此:
filep = (const char *)it;
然而,你做了额外的,不必要的步骤,因为你可以这样做:
filep = it->c_str();
将代码的行数减少到只有两行,并且不使用额外的指针。
PS:可以在Bathsheba's answer中找到更现代的方法,或使用auto&&
approach。
答案 2 :(得分:0)
std::string
是一种与const char *
完全不同的类型。因此,您需要将基础character buffer
存储在字符串中。为此,您必须使用方法std::string::c_str()
或std::string::data()
,无论您喜欢什么。
如下所示(灵感来自现在使用range-based for-loop
的其他答案),
const char *filep //fopen needs a constant char pointer.
for (auto & str : filelist)
{
filep = str.c_str();
fopen(filep, "rb");
}
答案 3 :(得分:0)
创建一个方法getstring,在其中返回字符串。
for(unsigned int i=0; i<iterator.size();i++){
cout << iterator[i]->getstring()<<endl;
}