C ++用迭代器初始化向量

时间:2016-06-20 13:44:18

标签: c++ string vector ifstream stringstream

我试图将无符号字符的文件读入向量。我稍微迂回的做法是创建一个输入文件流,将该数据读入字符串流,并使用stringstream的内容初始化一个向量。可能有更好的方法来执行此操作,并且我现有的代码会导致使用某些文件出现分段错误。

string file_name = "output/comp" + to_string(start_id) + ".xml";

if( !file_exists(file_name))
{
    cout << "File could not be found." << endl;
    return 0;
}

ifstream ifs(file_name);
stringstream ss;
ss << ifs.rdbuf();
ss >> noskipws;

vector<unsigned char> raw_data(ss.str().begin(), ss.str().end());

我已经包含了所有必需的标头和using声明,file_exists()返回一个布尔值,表示文件是否存在。

我的问题是:为什么上述代码不正确,正确实现同一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:8)

std::stringstream::str()返回std::string。也就是说,它是一个临时字符串。

因此ss.str().begin()返回临时字符串的开始迭代器,ss.str().end()返回不同临时字符串的结束迭代器,因为ss.str()个调用都是返回不同的临时字符串。你不能在不同的对象之间混合迭代器!

要解决此问题,请使用一个字符串:

std::string str = ss.str();

现在只需通过str.begin()str.end()

答案 1 :(得分:2)

的问题
vector<unsigned char> raw_data(ss.str().begin(), ss.str().end());

str()返回一个临时字符串。这意味着您用于string的{​​{1}}与用于begin的{​​{1}}不同。由于迭代器不引用相同的string,因此不能一起使用它们。

我们可以使用end来直接将文件读取到向量中,而不是使用string

strignstream

答案 2 :(得分:0)

我不确定为什么会导致段错误,也许是字符串流中的某些东西,但是使用c ++ 11,一旦你有任何istream派生词,就很容易将文件读成字符串:

std::string readFileAsString(std::istream& stream)
{
     return std::string(std::istreambuf_iterator<char>(stream), std::istreambuf_iterator<char>());
}

编辑抱歉,我忘了你想要最后的字节

return std::vector<char>(std::istreambuf_iterator<char>(stream), std::istreambuf_iterator<char>());