我有功能:
int read_file() {
ifstream file("plik");
if(!file.is_open()) {
throw -1;
}
int i = 0;
string line[MAXSIZE];
while(getline(plik, line[i])) {
cout<<line[i]<<endl;
i++;
}
return i;
}
但我想返回字符串数组:
line[]
我该怎么做?
答案 0 :(得分:14)
别。数组不可复制。
改为使用std::vector<std::string>
。
答案 1 :(得分:3)
如果你真的真的想要,你可以动态分配一个数组并返回一个指向该数组的指针:
std::string* getArray()
{
return (new std::string[10]);
}
但是你需要满足使用delete[]
释放你分配的内存以避免内存泄漏。
问问自己:
delete[]
之后意外地使用它,会发生什么? (分段错误就是答案)。std::vector
为你保留物品的数量,所以没问题。这就是为什么使用std::vector<std::string>
是一个更好的主意。返回指向动态分配的数组的指针会引入各种问题,这些问题比解决的问题更好避免。
答案 2 :(得分:3)
标准8.3.5p6:
函数不应具有类型数组或函数的返回类型,尽管它们可能具有类型指针的返回类型或对此类事物的引用。
正如@Tomalak暗示的那样,对数组说“不要说”。如果你可以使用vector
,它们通常可以避免各种各样的陷阱。
答案 3 :(得分:2)
我建议不要再回复std::vector<std::string>
。相反,我会传递一个迭代器,并让函数将数据写入迭代器所指向的位置。这样,函数可以很好地将数据写入向量或双端队列,或者(如果需要)直接写入输出流。
使用它,你的功能接近于平凡:
// I've changed the definition slightly, to let you pass it a filename instead
// of hard-coding one.
//
template <class outIt>
void read_file(std::string const &filename, outIt output) {
std::ifstream in(filename);
std::string line;
while (std::getline(in, line))
*output++ = line;
}
要使用此功能将数据复制到标准输出,大致与问题一样,您可以执行以下操作:
read_file("plik", std::ostream_iterator<std::string>(std::cout, "\n"));