2013-02-25 1 views
0

:현재 파일을 어떻게 덮어 쓸 수 있습니까? 다음 코드

fstream file("file.txt", ios::in): 

//some code 
//"file" changes here 

file.close(); 
file.clear(); 
file.open("file.txt", ios::out | ios::trunc); 

방법 마지막 세 줄은 현재 파일이 종료되지 않도록 변경,하지만 모두가 지워졌습니다와 함께 "다시 열"수 있는가?

+1

정확하게 무엇을하려합니까? 즉 '모든 것이 비어 있음'이란 무엇입니까? 귀하의 질문에 단순히 삭제하고 다시 원하는대로 할 것이라고 소리. – us2012

+0

@ us2012 네, 파일을 완전히 다시 만들고 싶습니다만, 명시 적으로 파일을 삭제하고 다시 만들 필요가 없다면 좋을 것입니다. –

답변

2

질문을 올바르게 이해하고 있다면 파일을 닫지 않고 모든 내용을 지우고 싶습니다. 즉, EOF 위치를 설정하여 파일 크기를 0으로 설정하고 싶습니다. 당신이 제시 한 해결책이 가장 매력적입니다.

다른 옵션은 Windows의 경우 SetEndOfFile() 또는 POSIX의 truncate()와 같이 파일의 끝을 설정하기 위해 OS 특정 기능을 사용하는 것입니다.

파일의 시작 부분에만 쓰려고하면 Simon의 솔루션이 작동합니다. 파일 끝을 설정하지 않고 이것을 사용하면 마지막 위치에서 쓰레기 데이터가있는 상황이 생길 수 있습니다.

1

당신은 되감기 파일 수 : 파일의 시작 부분에 넣어 포인터를 다시 넣어, 당신이 뭔가를 쓰기 때문에 다음 번에이 파일의 내용을 덮어 쓰게됩니다. 이를 위해이 같은 seekp을 사용할 수 있습니다 : 그것은 콘텐츠를 삭제하지 않는

fstream file("file.txt", ios::in | ios::out); // Note that you now need 
               // to open the file for writing 
//some code 
//"something" changes here 

file.seekp(0); // file is now rewinded 

하는 것으로. 덮어 쓰는 경우에만주의하십시오.

+0

'(ios :: in | ios :: out) & ~ ios :: ate'도이 작업을 수행하지 않습니까? –

0

나는, 당신은 "file.txt를"매개 변수 주위에 통과 피하기 위해 노력하고 있으며

void rewrite(std::ofstream & f) 
{ 
    f.close(); 
    f.clear(); 
    f.open(...); // Reopen the file, but we dont know its filename! 
} 

그러나 ofstream가 기본이되는 스트림의 파일 이름을 제공하지 않습니다

같은 것을 구현하려고 같은데요 기존 데이터를 지우는 방법을 제공하지 않으므로 운이 좋지 않습니다. ( seekp을 제공합니다. 쓰기 커서를 파일의 시작 부분에 놓을 수는 있지만 기존 내용은 자르지 않습니다.)

필자는 파일 이름을 필요한 기능에 전달하거나

void rewrite(std::ostream & f, const std::string & filename) 
{ 
    f.close(); 
    f.clear(); 
    f.open(filename.c_str(), ios::out); 
} 

또는 파일 스트림과 파일 이름을 클래스로 패키지화하십시오. 당신이 열심을 통해 느끼는 경우

class ReopenableStream 
{ 
    public: 
    std::string filename; 
    std::ofstream f; 

    void reopen() 
    { 
     f.close(); 
     f.clear(); 
     f.open(filename.c_str(), ios::out); 
    } 

    ... 
}; 

당신은 당신이 잔인한 사람처럼 보인다 IMO reopenable_stream<<foo;보다는 reopenable_stream.f<<foo 쓰기 만 할 수 있도록 ReopenableStream 실제로 스트림처럼 동작 할 수있다.

관련 문제