2016-12-21 8 views
0

그래도 std::fstream에 관한 많은 정보를 찾았지만 여전히 작동 방법을 이해할 수 없습니다. 의이 최소한의 예를 보자 :이 작동하지 않습니다전체 파일을 읽은 다음 동일한 std :: fstream에서 모두 덮어 씁니다.

#include <fstream> 
#include <string> 

int main() 
{ 
    std::fstream fs{ "somefile.txt", std::fstream::out | std::fstream::in }; 
    std::string line; 

    while (std::getline(fs, line)) 
    { 
    // reads the whole file 
    } 

    // the purpose is to overwrite the whole file 
    fs.seekp(0, std::ios_base::beg); // moves at the beginning 
    fs << "Hello world!" << std::endl; // writes in the file 

    // possibly other read/write 
} 

, 하나가 먼저 읽은 후 내가 읽어 모든에 따라 동일한 스트림에 쓸 수없는 것 같다. 파일을 닫은 다음 std::ios_base::trunc 플래그으로 여는 방법으로 해결 방법을 알고 있습니다. 그러나 그것은 무의미한 것처럼 보입니다. 왜 그런 제한이 있습니까? 독서 후에 파일을 기술적으로 덮어 쓸 수는 없습니까?

+1

어쩌면 당신은'eof' 비트를 지울 필요가 있습니다 –

+0

이것은 문제가되지 않지만 여분의 것들이 필요하지 않는 한'std :: endl'을 사용하지 마십시오. '\ n '은 한 줄을 끝냅니다. –

+0

@ForceBru 아무 것도 쓰지 않지만 파일의 수정 시간이 변경되지 않습니다. – Boiethios

답변

1

전체 파일을 읽은 후 fs은 이제 eof 상태입니다. IO 작업을 수행 할 수 있도록 상태를 지워야합니다.

4

루프는 실패 비트가 설정 될 때까지 반복됩니다. 시크에 그냥 clear() 플래그 이전 : 만 충분 시작 비트를 덮어 쓰려면

fs.clear(); 

. 또한 스트림을 자르려면 명시 적으로 close()open()입니다. 여기에서 open()std::ios_base::in으로 설정되지 않습니다.

+0

예, 문자열을 쓰지 만 전체 파일을 덮어 쓰지 않습니다. – Boiethios

+0

@Boiethios : 그 기능을 수행하기위한 코드를 작성하지 않았습니다. 그것을 위해 fstream을 비난하지 마십시오. –

+0

왜 파일을 해제 한 다음 다시 열어야합니까? 정상적으로 필요하지 않은 작업이 있습니다! – Boiethios