C ++写到文件的前面

时间:2010-04-01 22:01:14

标签: c++ file io

我需要打开一个文件作为ofstream并写入文件的前面,同时保留 文件的剩余内容,将被“移动”。与“prepend”相似 一个文件。

这可以使用STL还是提升?

3 个答案:

答案 0 :(得分:16)

不 - 这里的语言(或库)并没有太大的区别。大多数文件系统都不允许它,完全停止。

获得相同效果的常用方法是将新数据写入新文件,然后根据您编写的数据将旧文件中的数据复制到新文件中。

答案 1 :(得分:5)

不,不是。这之前已经多次被问过了。如果要执行此操作,则必须创建新文件,将“prepend”数据写入其中,然后打开现有文件并将其内容复制到新文件中。

答案 2 :(得分:1)

新的iostream类可以包装该功能。这假设您的前置数据不是太大而不能舒适地适合内存。像常规ofstream一样使用它。

#include <fstream>
#include <sstream>
#include <vector>

class prepend_ofstream
    : public std::ostringstream {
    std::filebuf file;
public:
    prepend_ofstream() {}
    prepend_ofstream( char const *name, openmode mode = out ) {
        open( name, mode );
    }
    ~prepend_ofstream() {
        if ( is_open() ) close();
    }
    void open( char const *name, openmode mode ) {
        if ( ! file.open( name, mode & binary | in | out ) ) {
            setstate( failbit );
        }
    }
    bool is_open() { return file.is_open(); }
    void close() {
        if ( ! is_open() ) {
            setstate( failbit );
            return;
        }
        char *strbuf = &str()[0];
        std::vector<char> buf( str().size() );
        int rdsz;
        do {
            rdsz = file.sgetn( &buf[0], buf.size() );
            file.pubseekoff( -rdsz, cur );
            file.sputn( strbuf, buf.size() );
            file.pubseekoff( 0, cur ); // "update the output sequence"
            std::copy( &buf[0], &buf[0]+rdsz, strbuf );
        } while ( rdsz == buf.size() );
        file.sputn( &buf[0], rdsz );
        if ( ! file.close() ) {
            setstate( failbit );
        }
    }
};

通常,功能是通过新的流缓冲区类添加的,而不是实际的流,但在这种情况下,新功能位于close,遗憾的是它不是虚拟的。