我需要用c ++读取文件并将每行(保存在矢量中)保存下来,因为我稍后将对其进行处理。
我还需要保存一个char *向量,该向量将指向每个字符串*的第一个位置。
问题是我不知道如何将string*
分配给char*
。
仅供参考,我不能使用const char*
,它必须是char*
。
代码:
void ClassA::readFile() {
std::ifstream file("test.txt");
std::string* str = new string();
while (std::getline(file, *str))
{
_aVector.push_back(*str);
char *c = &str[0]; <-- This works if string is not declared as string*
char *c = .... <--What is the equivalent for string*
str = new string();
someFunction(c); <-- This function saves the *c in a vector.
}
}
答案 0 :(得分:1)
尽管std::string
协议可让您访问基础内存,例如通过调用成员c_str()
,这些指针都是const
。如果将其强制转换为非const指针,则如果您无法控制的函数随后通过此类指针修改内容,则可能会面临不确定的行为。
从C ++ 17开始,data
方法使您可以访问指向基础数据的非常量指针。
无论如何,请注意,如果有必要,字符串对象将再次替换基础内存,这超出了您的控制范围,并且指针可能随后变得无效。因此,我想说,存储指向字符串对象内容的指针通常不是一个好主意。
将char*
指针指向我看到的std::string
内容的唯一方法是复制字符串的内容,例如通过使用strdup
。从而避免了意外修改访问带来的不确定行为,并使char*
从字符串对象管理的内存中解耦。
请参见以下代码对此进行说明:
int main() {
std::vector<std::string> aVector;
std::ifstream file("test.txt");
std::string str;
while (std::getline(file, str))
{
aVector.push_back(str);
char *c = strdup(str.c_str());
someFunction(c); // <-- This function saves the *c in a vector.
}
}