2010-04-01 5 views
11

파일의 나머지 부분을 보존하고있는 동안 ofstream으로 파일을 열고 파일의 앞에 쓸 필요가 있습니다.이 파일은 "이동"됩니다. "prepend"와 비슷한 파일 .파일 앞에 C++로 쓰기

STL 또는 부스트를 사용하면 가능합니까?

답변

5

아니요. 그리고 이것은 전에 여러 번 여기에서 물었습니다. 이렇게하려면 새 파일을 만들고 "prepend"데이터를 작성한 다음 기존 파일을 열고 해당 내용을 새 파일에 복사해야합니다.

16

아니요 - 언어 (또는 라이브러리)가 실제로 큰 차이점을 보이지 않습니다. 대부분의 파일 시스템은이를 허용하지 않습니다.

동일한 효과를 얻으려면 새 파일에 새 데이터를 쓰고 작성한 데이터 다음에 이전 파일의 데이터를 새 파일에 복사해야합니다.

+0

어떻게 불가능하다고 말하면서 어떻게 처리하는지 설명 할 수 있습니까? Boost는 파일 시스템 라이브러리 인 http://www.boost.org/doc/libs/1_42_0/libs/filesystem/doc/index.htm에'boost :: remove'를 제공합니다. 실제로 링크를 해제하려면 차이를 만듭니다 오래된 파일을 만들고 새로운 파일을 만드십시오 - 그런 것이 필수적이지 않거나 그것을 구현하는 좋은 방법이 아닙니다. OP는 단선을 요구하지 않았고, 그는 도움을 요청했다. – Potatoswatter

+6

그는 어떻게하는지 설명하지 않습니다. 그는이 문제에 대한 표준 해결책을 설명합니다. – Nate

+0

어, 해결 방법이되는 것은 작업을 수행한다는 의미입니다. 더 중요한 것은 휴대용이기 때문에 C++을 사용하고 언어와 라이브러리는 매우 구체적인 기능을 사용하여 문제를 해결하기 때문에 차이가 있습니다. 내 대답을 보라. – Potatoswatter

1

새로운 iostream 클래스가 해당 기능을 래핑 할 수 있습니다. 이것은 prepend 데이터가 너무 커서 메모리에 편안하게 맞지 않는다고 가정합니다. 일반 ofstream처럼 사용하십시오.

#include <fstream> 
#include <sstream> 
#include <vector> 

class prepend_ofstream 
    : public std::ostringstream { 
    std::filebuf file; 
public: 
    prepend_ofstream() {} 
    prepend_ofstream(char const *name, openmode mode = out) { 
     open(name, mode); 
    } 
    ~prepend_ofstream() { 
     if (is_open()) close(); 
    } 
    void open(char const *name, openmode mode) { 
     if (! file.open(name, mode & binary | in | out)) { 
      setstate(failbit); 
     } 
    } 
    bool is_open() { return file.is_open(); } 
    void close() { 
     if (! is_open()) { 
      setstate(failbit); 
      return; 
     } 
     char *strbuf = &str()[0]; 
     std::vector<char> buf(str().size()); 
     int rdsz; 
     do { 
      rdsz = file.sgetn(&buf[0], buf.size()); 
      file.pubseekoff(-rdsz, cur); 
      file.sputn(strbuf, buf.size()); 
      file.pubseekoff(0, cur); // "update the output sequence" 
      std::copy(&buf[0], &buf[0]+rdsz, strbuf); 
     } while (rdsz == buf.size()); 
     file.sputn(&buf[0], rdsz); 
     if (! file.close()) { 
      setstate(failbit); 
     } 
    } 
}; 

일반적 기능은 새로운 스트림을 버퍼 클래스가 아니라, 실제 스트림이 추가되어 있지만,이 경우, 새로운 기능은 가상 불행히도하지 않다 close이다.