사용 시나리오는 산업 (불안정한 전원 공급 장치 및 기타 버그가 많은 프로그램/하드웨어)입니다. 전원이 꺼지면 (또는 블루 스크린 충돌) 프로그램이 영향을받지 않아야합니다. OS는 NTFS를 사용하는 Windows 7입니다.ofstream (모드 ios :: out)은 시스템이 중단 될 때 기존 파일을 지워줍니다.
boost :: property_tree write json을 사용하여 사람이 읽을 수있는 텍스트 파일에 매개 변수를 기록합니다.
boost::property_tree::write_json("logic.txt", pt);
실제로 시스템이 중단 될 때 "logic.txt"가 지워지는 경우가 있습니다. 나는 부스트 소스 파일을 읽고 write_json 통화는 기본 IOS와 ofstream :: 밖으로
std::basic_ofstream<typename Ptree::key_type::value_type> stream(filename.c_str());
문제는 기존 파일을 닦아 ofstream하고 시스템이 실패 할 때 빈 파일을 둡니다한다.
ofstream의 알려진 문제입니까? 이것에 가장 적합한 해결책은 무엇입니까? 나는 몇 가지 생각할 수 : 완료되면 "logic_tmp.txt는"첫째, 삭제 "logic.txt"와 logic.txt 할 수있는 임시 파일의 이름을 변경하는
쓰기 파일을.
직접 파일에 쓰는 대신 SQLite를 사용하십시오. (MySQL은 몇 번 깨고, 다시 시작할 때 테이블을 "복구"해야합니다. SQLite는 아직 나를 실패하지 않았습니다.)
어떤 제안이 도움이 될 것입니다.
"내 데이터를 먹어 모두가 파일 IO를 잘못 가져 오는 방법"https://www.flamingspork.com/talks/ (여기에 캐시 됨 : http://downloads.sehe.nl/zfs-fuse/File_IO_Safety)를 참조하십시오. .gog) – sehe
@sehe 흥미로운 이야기, 나는 많은 SQLite (큰 파일을 피하고 경주를 최소화)를 'force flush'로 가정하면 도움이 될 수 있습니다. – Guangyu