2009-08-19 18 views
6

Czytałem, że boost iostreams podobno obsługuje 64-bitowy dostęp do dużych plików w półprywatny sposób. Ich FAQ wymienia 64 bit offset functions, ale nie ma przykładów, jak z nich korzystać. Czy ktoś użył tej biblioteki do obsługi dużych plików? Prosty przykład otwierania dwóch plików, szukania ich środków i kopiowania jednego na drugi byłby bardzo pomocny.Czy ktoś może podać przykład wyszukiwania, czytania i zapisywania pliku> 4GB za pomocą doładowania iostreams

Dzięki.

Odpowiedz

7

Krótka odpowiedź

Wystarczy obejmują

#include <boost/iostreams/seek.hpp> 

i użyć funkcji seek jak w

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

gdzie

  • device to plik, potok, streamb uf lub dowolny obiekt zamienny na seekable;
  • offset jest 64-bitowym przesunięciem typu stream_offset;
  • whence to BOOST_IOS::beg, BOOST_IOS::cur lub BOOST_IOS::end.

wartość powrotu seek jest typu std::streampos i może zostać przekształcony w stream_offset użyciu funkcji position_to_offset.

Przykład

Oto długie, żmudne i monotonne przykład, który pokazuje, jak otworzyć dwa pliki, dążyć do offstets> 4GB i kopiowania danych pomiędzy nimi.

OSTRZEŻENIE: Ten kod utworzy bardzo duże pliki (kilka GB). Spróbuj tego przykładu w systemie OS/files obsługującym pliki rozrzedzone. Linux jest w porządku; Nie testowałem go na innych systemach, takich jak 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(); 
} 
+0

W systemie Windows XP 32-bitowa konfiguracja funkcji() nie może utworzyć pliku o wielkości większej niż 2 GB na partycji NTFS. BOOST wersja 1.39, MS VS 2008 Express. – Xeningem