Запись C++ к передней стороне файла

Я должен открыть файл как ofstream и записать в переднюю сторону файла при сохранении остающегося содержания файла, который будет "перемещен". Подобный, чтобы "предварительно ожидать" файл.

Действительно ли этим возможным использованием является STL или повышение?

11
задан user231536 1 April 2010 в 22:01
поделиться

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

1
ответ дан 3 December 2019 в 05:12
поделиться

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

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

16
ответ дан 3 December 2019 в 05:12
поделиться

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

5
ответ дан 3 December 2019 в 05:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: