我读过 boost iostreams 应该支持 64 位访问大文件的半便携方式。他们的常见问题解答提到了64 位偏移函数,但没有关于如何使用它们的示例。有没有人使用这个库来处理大文件?打开两个文件,寻找它们的中间并将一个复制到另一个的简单示例将非常有帮助。
谢谢。
我读过 boost iostreams 应该支持 64 位访问大文件的半便携方式。他们的常见问题解答提到了64 位偏移函数,但没有关于如何使用它们的示例。有没有人使用这个库来处理大文件?打开两个文件,寻找它们的中间并将一个复制到另一个的简单示例将非常有帮助。
谢谢。
只包括
#include <boost/iostreams/seek.hpp>
并使用如下seek
功能
boost::iostreams::seek(device, offset, whence);
在哪里
device
是文件、流、streambuf 或任何可转换为的对象seekable
;offset
是类型为 64 位的偏移量stream_offset
;whence
是BOOST_IOS::beg
,BOOST_IOS::cur
或BOOST_IOS::end
.的返回值为seek
type std::streampos
,stream_offset
使用position_to_offset
函数可以将其转换为 a 。
这是一个冗长、乏味且重复的示例,它展示了如何打开两个文件,寻找 >4GB 的偏移量,以及在它们之间复制数据。
警告:此代码将创建非常大的文件(几 GB)。在支持稀疏文件的操作系统/文件系统上尝试此示例。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();
}