如何在使用fstream打开文件时截断文件

时间:2013-12-27 23:13:45

标签: c++ std fstream

我知道可以使用

截断文件
std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);

但是我需要读取文件,截断它,然后用相同的文件句柄写所有内容(所以整个操作都是原子的)。任何人吗?

3 个答案:

答案 0 :(得分:8)

我认为你不能进行“原子”操作,但是使用现在被Filesystem Technical Specification作为Standard Library (C++17)的一部分接受的{{3}}你可以像这样调整文件的大小:

#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";
}

答案 1 :(得分:6)

除打开文件外,文件流不支持截断。此外,操作无论如何都不是“原子的”:至少在POSIX系统上,您可以愉快地读取和写入另一个进程已经打开的文件。

答案 2 :(得分:-3)

C ++ 11支持ofstream onstream。我能想到的最好的方法是打开一个空文件并调用swap。这不是原子的,而是尽可能接近。