Come troncare un file mentre è aperto con fstream

So che è ansible troncare un file con

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

ma ho bisogno di leggere il file, troncarlo, quindi scrivere nuovi contenuti tutti con lo stesso handle di file (quindi l’intera operazione è atomica). Chiunque?

I flussi di file non supportano il troncamento tranne quando si apre un file. Inoltre, le operazioni non sarebbero comunque “atomiche”: almeno sui sistemi POSIX è ansible leggere e scrivere felicemente un file già aperto da un altro processo.

Non penso che si possa ottenere un’operazione “atomica” ma usando la specifica tecnica del filesystem che è stata ora accettata come parte della libreria standard (C ++ 17) è ansible ridimensionare il file in questo modo:

 #include  #include  #include  #include  // compilers that support the TS // #include  // 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"; } 

C ++ 11 supporta lo scambio su ofstream. Il meglio che potessi immaginare sarebbe quello di aprire un file vuoto e chiamare lo scambio. Questo non sarebbe atomico, ma il più vicino ansible.