2012-02-16 2 views
3

나는 진지한 노력에도 불구하고 여기에 버그를 찾을 수 없습니다. 나는 ofstream에 벡터를 쓰고있다. 벡터에 바이너리 데이터가 포함되어 있습니다. 그러나 어떤 이유로 공백 문자 (0x10, 0x11, 0x12, 0x13, 0x20)가 기록 될 것으로 예상되는 경우 건너 뜁니다.C++, ofstream 건너 뛰기 공백에 쓰기

필자는 반복기를 사용하고 직접 ofstream :: write()를 사용해 보았습니다.

여기에 제가 사용하고있는 코드가 있습니다. 내가 시도한 다른 방법 중 일부를 주석 처리했습니다.

void 
write_file(const std::string& file, 
      std::vector<uint8_t>& v) 
{ 
    std::ofstream out(file, std::ios::binary | std::ios::ate); 

    if (!out.is_open()) 
    throw file_error(file, "unable to open"); 

    out.unsetf(std::ios::skipws); 

    /* ostreambuf_iterator ... 
    std::ostreambuf_iterator<char> out_i(out); 
    std::copy(v.begin(), v.end(), out_i); 
    */ 

    /* ostream_iterator ... 
    std::copy(v.begin(), v.end(), std::ostream_iterator<char>(out, "")); 
    */ 

    out.write((const char*) &v[0], v.size()); 
} 

편집 : 코드를 다시 읽으십시오. 여기

void 
read_file(const std::string& file, 
      std::vector<uint8_t>& v) 
{ 
    std::ifstream in(file); 
    v.clear(); 

    if (!in.is_open()) 
    throw file_error(file, "unable to open"); 

    in.unsetf(std::ios::skipws); 

    std::copy(std::istream_iterator<char>(in), std::istream_iterator<char>(), 
     std::back_inserter(v)); 
} 

는 예를 들어 입력 :

30 0 0 0 a 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2 

그리고 이것은 내가 그것을 다시 읽을 때 나는 점점 오전 출력입니다 : 당신이 볼 수 있듯이

30 0 0 0 30 0 0 0 7a 70 30 0 0 0 32 73 30 0 0 0 2 71 30 0 0 4 d2 

, 0x0a가 ommited되고있다 표면적으로 공백이기 때문에.

의견을 보내 주시면 대단히 감사하겠습니다.

+4

다시 읽는 코드를 표시하십시오. –

+0

읽기 코드는 어떻게 생깁니 까? 문제가있을 수 있습니다 ... – fbrereto

+0

벡터의 내용이 실제로 쓰기 전에 예상했던 내용인지 확인 했습니까? (예 : 입력 단계가 공백을 제거 할 수 있습니다 ...) –

답변

1

<> 문자를 직접 작성하는 것보다 boost::serialization이 더 효과적이며 boost::archive::binary_oarchive을 사용합니다.

0

'a'는 새 줄로 취급됩니다. 나는이 문제를 해결하는 방법을 생각해야한다.

+0

그건 정확히 내가 생각하는거야. – nerozehl

1

read_file 함수에서 이진 모드로 파일을 여는 것을 잊었습니다.

0

istream_iterator는 공백을 무시합니다. 당신의 표준을 교체하십시오 ::이 함께 복사

std::copy(
    std::istreambuf_iterator<char>(in), 
    std::istreambuf_iterator<char>(), 
    std::back_inserter(v)); 

istreambuf_iterator 당신이보고있는 공백 처리를 방지 할 streambuf의 객체에 직접 간다.