Может кто-то обеспечивать пример поиска, чтения и записи a> файл на 4 ГБ с помощью повышения iostreams

Я читал, то повышение iostreams, предположительно, поддерживает доступ на 64 бита к большим файлам полупереносной путь. Их FAQ упоминает функции смещения на 64 бита, но нет никаких примеров о том, как использовать их. Кто-либо пользовался этой библиотекой для обработки больших файлов? Простой пример открытия двух файлов, поиска на их середину и копирования одного к другому был бы очень полезен.

Спасибо.

7
задан Jon Seigel 19 March 2010 в 15:48
поделиться

1 ответ

Краткий ответ

Просто включите

#include <boost/iostreams/seek.hpp>

и используйте функцию seek , как в

boost::iostreams::seek(device, offset, whence);

, где

  • устройство - файл, stream, streambuf или любой объект, конвертируемый в seekable ;
  • offset - это 64-битное смещение типа stream_offset ;
  • откуда равно BOOST_IOS :: begin , BOOST_IOS :: cur или BOOST_IOS :: end .

Возвращаемое значение seek имеет тип std :: streampos , и его можно преобразовать в stream_offset с помощью position_to_offset функция.

Пример

Вот длинный, утомительный и повторяющийся пример, который показывает, как открывать два файла, искать смещения> 4 ГБ и копировать данные между ними.

ПРЕДУПРЕЖДЕНИЕ: этот код создаст очень большие файлы (несколько ГБ). Попробуйте этот пример в ОС / файловой системе, которая поддерживает разреженные файлы. Linux в порядке; Я не тестировал на других системах, например на Windows.

/*
 * WARNING: This creates very large files (several GB)
 * unless your OS/file system supports sparse files.
 */
#include <boost/iostreams/device/file.hpp>
#include <boost/iostreams/positioning.hpp>
#include <cstring>
#include <iostream>

using boost::iostreams::file_sink;
using boost::iostreams::file_source;
using boost::iostreams::position_to_offset;
using boost::iostreams::seek;
using boost::iostreams::stream_offset;

static const stream_offset GB = 1000*1000*1000;

void setup()
{
    file_sink out("file1", BOOST_IOS::binary);
    const char *greetings[] = {"Hello", "Boost", "World"};
    for (int i = 0; i < 3; i++) {
        out.write(greetings[i], 5);
        seek(out, 7*GB, BOOST_IOS::cur);
    }
}

void copy_file1_to_file2()
{
    file_source in("file1", BOOST_IOS::binary);
    file_sink out("file2", BOOST_IOS::binary);
    stream_offset off;

    off = position_to_offset(seek(in, -5, BOOST_IOS::end));
    std::cout << "in: seek " << off << std::endl;

    for (int i = 0; i < 3; i++) {
        char buf[6];
        std::memset(buf, '\0', sizeof buf);

        std::streamsize nr = in.read(buf, 5);
        std::streamsize nw = out.write(buf, 5);
        std::cout << "read: \"" << buf << "\"(" << nr << "), "
                  << "written: (" << nw << ")" << std::endl;

        off = position_to_offset(seek(in, -(7*GB + 10), BOOST_IOS::cur));
        std::cout << "in: seek " << off << std::endl;
        off = position_to_offset(seek(out, 7*GB, BOOST_IOS::cur));
        std::cout << "out: seek " << off << std::endl;
    }
}

int main()
{
    setup();
    copy_file1_to_file2();
}
7
ответ дан 7 December 2019 в 07:48
поделиться
Другие вопросы по тегам:

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