C ++どのように与えられたオフセットを持つオブジェクトを読み込むには?
-
20-08-2019 - |
質問
今、私はそれで多くのデータを含むファイルを持っています。 そして、私は私が必要とするデータは、位置(長さ)xで始まり、指定したサイズはsizeof(y)を持って知っています 私はこのデータを取得できますか?
解決
seek
メソッドを使用します:
ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
他のヒント
あなたは所望のオフセットにファイルにあなたの「現在位置」を変更するにfseek()を使用する必要があります。 「f」は、あなたのFILE *変数を、オフセットされたオフセットがあれば、これはコールがどのように見える(私の漏出性メモリを法)する方法です。
fseek(f, offset, SEEK_SET);
は、前述した通常のシークと-読み取り技術の他にも、<のhref = "http://www.opengroup.org/onlinepubs/000095399/functions/mmapのようなものを使用して、プロセス空間にファイルをマップすることができます.htmlの」REL = "nofollowをnoreferrer">のmmap()と直接データにアクセスします。
たとえば、次のデータファイルを指定された "foo.dat"
one two three
次のコードは、 MMAPを使用して最初の4バイトの後のすべてのテキストを印刷します()に基づくアプローチ:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main()
{
int result = -1;
int const fd = open("foo.dat", O_RDONLY);
struct stat s;
if (fd != -1 && fstat(fd, &s) == 0)
{
void * const addr = mmap(0, s.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
if (addr != MAP_FAILED)
{
char const * const text = static_cast<char *>(addr);
// Print all text after the first 4 bytes.
std::cout << text + 4 << std::endl;
munmap(addr, s.st_size);
result = 0;
}
close(fd);
}
return result;
}
あなたも、(に覚えているファイルに直接書き込むためにこの方法を使用することができますMSYNC()の必要に応じて)。
ブーストおよびACEなどのライブラリは、mmapのための素晴らしいC ++のカプセル化()(と同等のWindowsの機能)を提供します。
このアプローチは、小さなファイルのために、おそらく過剰ですが、それは大きなファイルのための巨大な勝利することができます。いつものように、最適なアプローチを決定するためにあなたのコードをプロファイリングます。