Подтвердить что ты не робот

С++ писать перед файлом

Мне нужно открыть файл как поток и записать в начало файла, сохраняя при этом оставшееся содержимое файла, которое будет "перемещено". Подобно "preend" файл.

Возможно ли использование STL или boost?

4b9b3361

Ответ 1

Нет - язык (или библиотека) здесь не имеет особого значения. Большинство файловых систем просто не позволяют, полная остановка.

Обычный способ получить тот же эффект - записать новые данные в новый файл, а затем скопировать данные в старом файле в новый файл после данных, которые вы написали.

Ответ 2

Нет, это не так. И об этом просили здесь много раз. Если вы хотите сделать это, вам нужно создать новый файл, записать в него "предварительные" данные, затем открыть существующий файл и скопировать его содержимое в новый файл.

Ответ 3

Новый класс 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, что, к сожалению, не является виртуальным.