私はファイルを切り捨てることが可能であることを知っています
std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);
しかし、ファイルを読み取り、切り捨ててから、すべて同じファイルハンドルで新しいコンテンツを書き込む必要があります(したがって、操作全体がアトミックです)。誰でも?
「アトミック」操作を取得できるとは思いませんが、 標準ライブラリ(C++ 17) の一部として受け入れられている ファイルシステム技術仕様 を使用します次のようにファイルのサイズを変更できます。
#include <fstream>
#include <sstream>
#include <iostream>
#include <experimental/filesystem> // compilers that support the TS
// #include <filesystem> // C++17 compilers
// for readability
namespace fs = std::experimental::filesystem;
int main(int, char*[])
{
fs::path filename = "test.txt";
std::fstream file(filename);
if(!file)
{
std::cerr << "Error opening file: " << filename << '\n';
return EXIT_FAILURE;
}
// display current contents
std::stringstream ss;
ss << file.rdbuf();
std::cout << ss.str() << '\n';
// truncate file
fs::resize_file(filename, 0);
file.seekp(0);
// write new stuff
file << "new data";
}
ファイルストリームは、ファイルを開く場合を除いて、切り捨てをサポートしていません。また、操作はとにかく「アトミック」ではありません。少なくとも、POSIXシステムでは、別のプロセスによって既に開かれているファイルを楽しく読み書きできます。