Comment tronquer un fichier lorsqu’il est ouvert avec fstream

Je sais qu’il est possible de tronquer un fichier avec

std::fstream fs(mypath, std::fstream::out | std::fstream::trunc); 

mais j’ai besoin de lire le fichier, de le tronquer, puis d’écrire un nouveau contenu, toujours avec le même descripteur de fichier (l’opération est donc entièrement atomique). N’importe qui?

Les stream de fichiers ne prennent pas en charge la troncature, sauf lors de l’ouverture d’un fichier. De plus, les opérations ne seraient de toute façon pas “atomiques”: du moins, sur les systèmes POSIX, vous pouvez lire et écrire avec plaisir un fichier déjà ouvert par un autre processus.

Je ne pense pas que vous puissiez obtenir un fonctionnement “atomique”, mais vous pouvez redimensionner le fichier à l’aide de la spécification technique de système de fichiers acceptée à présent dans la bibliothèque standard (C ++ 17) :

 #include  #include  #include  #include  // comstackrs that support the TS // #include  // C++17 comstackrs // 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"; } 

C ++ 11 prend en charge l’échange sur ofstream. Le mieux que je puisse imaginer serait d’ouvrir un fichier vide et d’appeler le swap. Ce ne serait pas atomique, mais aussi proche que possible.