C++ 用迭代器初始化向量
C++ initializing vector with iterators
我正在尝试将无符号字符文件读入矢量。我略微迂回的方法是创建一个输入文件流,将该数据读入一个字符串流,然后使用字符串流的内容初始化一个向量。可能有更好的方法来执行此操作,而我现有的代码会导致使用某些文件出现分段错误。
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());
我已经包含了所有必要的 headers 和 using
声明,并且 file_exists()
returns 一个布尔值指示文件是否存在。
我的问题是:为什么上面的代码不正确,正确完成相同代码的最佳方法是什么objective?
我不太确定为什么这会导致段错误,也许是字符串流中的某些错误,但是使用 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>());
std::stringstream::str()
returns一个std::string
。也就是说,它是一个临时字符串。
所以 ss.str().begin()
returns 临时字符串的起始迭代器,ss.str().end()
returns 不同[=29= 的结束迭代器] 临时字符串,因为两个 ss.str()
调用都返回 不同的 临时字符串。您不能在不同对象之间混合使用迭代器!
要解决此问题,请使用一个字符串:
std::string str = ss.str();
现在只需传递 str.begin()
和 str.end()
。
的问题
vector<unsigned char> raw_data(ss.str().begin(), ss.str().end());
是str()
returns一个临时字符串。这意味着您用于 begin
的 string
与您用于 end
的 string
不同。由于迭代器不引用相同的 string
,因此您不能将它们一起使用。
我们可以使用 istream_iterator
之类的
直接将文件读入向量,而不是使用 strignstream
std::ifstream ifs(file_name);
std::istream_iterator<unsigned char> start(ifs), end;
std::vector<unsigned char> raw_data(start, end);
我正在尝试将无符号字符文件读入矢量。我略微迂回的方法是创建一个输入文件流,将该数据读入一个字符串流,然后使用字符串流的内容初始化一个向量。可能有更好的方法来执行此操作,而我现有的代码会导致使用某些文件出现分段错误。
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());
我已经包含了所有必要的 headers 和 using
声明,并且 file_exists()
returns 一个布尔值指示文件是否存在。
我的问题是:为什么上面的代码不正确,正确完成相同代码的最佳方法是什么objective?
我不太确定为什么这会导致段错误,也许是字符串流中的某些错误,但是使用 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>());
std::stringstream::str()
returns一个std::string
。也就是说,它是一个临时字符串。
所以 ss.str().begin()
returns 临时字符串的起始迭代器,ss.str().end()
returns 不同[=29= 的结束迭代器] 临时字符串,因为两个 ss.str()
调用都返回 不同的 临时字符串。您不能在不同对象之间混合使用迭代器!
要解决此问题,请使用一个字符串:
std::string str = ss.str();
现在只需传递 str.begin()
和 str.end()
。
vector<unsigned char> raw_data(ss.str().begin(), ss.str().end());
是str()
returns一个临时字符串。这意味着您用于 begin
的 string
与您用于 end
的 string
不同。由于迭代器不引用相同的 string
,因此您不能将它们一起使用。
我们可以使用 istream_iterator
之类的
strignstream
std::ifstream ifs(file_name);
std::istream_iterator<unsigned char> start(ifs), end;
std::vector<unsigned char> raw_data(start, end);