gpt4 book ai didi

c++ - 将文件的一部分读入 std::vector 的有效方法?

转载 作者:行者123 更新时间:2023-11-30 02:52:52 25 4
gpt4 key购买 nike

引用这个问题:Efficient way of reading a file into an std::vector<char> ?我需要一个执行以下操作的函数:

void readFromFile( std::vector< unsigned char >& buffer,
string filename,
size_t offset, size_t count );

所以函数从文件中读取偏移量到偏移量+计数到 vector 中;

void readFromFile( std::vector< unsigned char >& buffer,
string filename,
size_t offset, size_t count )
{
// get file size and reallocate the buffer
size_t fsize = filesize( filename );
buffer.reserve( buffer.size() + size );

// open the file
ifstream file( filename );

// first way
file.seekg( offset );
file.read( ???? )

// second way
istreambuf_iterator< unsigned char > from( file );
istreambuf_iterator< unsigned char > eof;

advance( from, offset );
copy( from, eof, back_inserter( buffer );
}

第一种方式我不知道如何一次读取文件。在第二种方式中,读取操作非常慢,因为我逐字节读取。

有更好的选择吗?

编辑

感谢@Ben Voigt

我写了这两个简单的函数:

inline std::streamsize filesize( const std::string& filename )
{
std::ifstream in( filename, std::ifstream::in | std::ifstream::binary );
if ( !in ) throw std::invalid_argument
{
"filesize error: invalid filename"
};

in.seekg( 0, std::ifstream::end );
return in.tellg();

// here the file is closed. so no need to restore the get pointer
}

inline std::streamsize filesize( std::ifstream& file )
{
file.seekg( 0, std::ifstream::end );
const auto size = file.tellg();
file.seekg( 0 ); // restore the get pointer
return size;
}

template< typename RAIter >
inline void read_file( std::istream& file,
RAIter first, RAIter last,
std::streamsize offset = 0
)
{
const auto size = last - first;
file.seekg( offset, std::ifstream::beg );
file.read( reinterpret_cast< char* >( &*first ), size );
}

template<>
inline void read_file( std::istream& file,
unsigned char* first, unsigned char* last,
std::streamsize offset /*= 0 no default argument in template spacalization. */
)
{
const auto size = last - first;
file.seekg( offset, std::ifstream::beg );
file.read( reinterpret_cast< char* >( first ), size );
}

所以这个函数现在变得简单了:

vector< unsigned char > buffer;
// do something with buffer

const string filename{ "blabla" };

const auto size = filesize( filename );

// resize the buffer
auto const OLD_LEN = buffer.size();
buffer.resize( OLD_LEN + size );

size_t startOffset = 0; // from where to star reading from file
size_t cont = size; // how manny bytes read from file

// read filename from startOffset to startOffset + count, appendeing in buffer
ifstream file( filename );
read_file( file,
buffer.data() + OLD_LEN,
buffer.data() + OLD_LEN + count,
startOffset
);

最佳答案

auto old_end = buffer.size();
buffer.resize( old_end + blocksize );

//...

file.read( &buffer[old_end], blocksize );
auto actual_size = file.gcount;
if (actual_size < blocksize) buffer.resize(old_end + actual_size);

关于c++ - 将文件的一部分读入 std::vector<char> 的有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18495790/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com