2016-06-20 9 views
0

부호없는 파일의 파일을 벡터로 읽으려고합니다. 이것을하기위한 약간의 순환적인 방법은 입력 파일 스트림을 생성하고, 그 데이터를 문자열 스트림으로 읽고, 문자열 스트림의 내용을 사용하여 벡터를 초기화하는 것입니다. 이 작업을 수행하는 것이 훨씬 더 좋은 방법 일 수 있으며, 기존 코드로 인해 특정 파일을 사용하여 분할 오류가 발생합니다.C++ 이터레이터로 벡터 초기화하기

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() 반환 파일이 존재하는지 여부를 나타내는 부울 값을 포함했다.

내 질문은 : 위의 코드가 잘못된 이유와 동일한 목표를 올바르게 수행하는 가장 좋은 방법은 무엇입니까?

+0

같은 istream_iterator의를 사용하여 벡터에 직접 파일을 읽을 수 있습니다 –

답변

8

std::stringstream::str()std::string 반환 끝에 바이트를 원 잊어 버렸습니다. 즉, 임시 문자열입니다.

그래서 ss.str().begin() 임시 문자열의 시작 반복자를 반환하고, 두 ss.str() 통화 다른 임시 문자열을 반환하기 때문에 ss.str().end()다른 임시 문자열의 끝 반복자를 돌려줍니다. 서로 다른 객체간에 반복자를 혼합 할 수 없습니다!

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

그리고 지금은 그냥 str.begin()str.end()을 통과 :

는이 문제를 해결 한 문자열을 사용합니다.

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

0

그 segfault의 문자열 스트림 아마도 뭔가를 야기하는 이유는 정확히 모르겠지만, 11 C++로는 어떤 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>()); 
2

문제는 str() 임시 문자열을 반환한다는 것입니다. 즉, begin에 사용하는 stringend에 사용하는 것과 같지 않습니다. string 이터레이터는 동일한 string을 참조하지 않으므로 함께 사용할 수 없습니다.

대신 strignstream을 사용하는 우리는 아마 파일 열기 모드로`binary`를 추가 할 필요가

std::ifstream ifs(file_name); 
std::istream_iterator<unsigned char> start(ifs), end; 
std::vector<unsigned char> raw_data(start, end);