C ++从文件写入std :: string * var

时间:2014-10-20 09:23:00

标签: c++ string file pointers char

实际上我遇到了将单个字符串保存到字符串*的问题。我有这样的功能:

void save(std::string* x, const std::string& file);

实际上我正在使用循环从文件中取出每个数字并将其分配给char ch;

所以,问题是如何将此char附加到字符串*?如果我创建临时字符串并将每个符号添加到此字符串中,然后执行strcpy或仅x = temp,我就会出现分段错误。

你能告诉我如何处理这件事吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

你永远不应该直接改变std :: string的缓冲区,因为它有自己的内存管理方法。

相反,您应该使用append()方法:

char temp;
//...
if(x)  //check for nullptr
{
    x->append(1, temp);  //appends the char 'temp' once
}

答案 1 :(得分:0)

听起来你正在创建一个本地字符串,然后将其分配给x - 就像这样:

std::string temp;
// Add to temp
// ...
x = &temp;

问题在于,x实际上是一个输出参数,您可以将其分配给本地。当函数超出范围时,本地(temp)将被销毁,x现在将指向被破坏的内存区域。这将使您违反访问权限。

您最好的选择是更改save,以便返回字符串。像这样:

std::string save(const std::string &file)
{
  std::string temp;
  // Do stuff...

  return temp;
}

现在,字符串将被正确复制(或移动,如果你是C ++ 11)回到调用者。您可以使用push_back将字符附加到temp

如果您不想返回字符串,请将引用传递给用户提供的字符串并填写:

void save(std::string &x, const std::string &file)
{
  char temp;
  x.push_back(temp);
}

然后像这样调用它:

std::string output;
save(output, "path/to/my/file);