如何使用 fstream 在文件打开的情况下截断文件

15
我知道可以使用截断文件的方法。
std::fstream fs(mypath, std::fstream::out | std::fstream::trunc);

但我需要读取文件、截断它,然后使用同一个文件句柄写入新内容(以便整个操作是原子的)。有人能帮忙吗?


2
据我所知,文件流不允许此功能。您需要使用“trunc”关闭并重新打开文件流才能实现该功能。 - David G
3个回答

15
我认为你无法使用“原子”操作,但是你可以使用已被接受为文件系统技术规范的一部分的标准库(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";
}

7

文件流在打开文件时支持截断,但在其他操作时不支持。此外,这些操作也不会是“原子性”的:至少,在POSIX系统上,你可以愉快地读写已经被另一个进程打开的文件。


-3

C++ 11 支持在 ofstream 上进行交换。我能想到的最好的方法是打开一个空文件并调用 swap。这不是原子操作,但已经尽可能接近了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接