これで、多くのデータを含むファイルができました。そして、必要なデータが位置 (long)x から始まり、指定されたサイズ sizeof(y) であることを知っています。このデータを取得するにはどうすればよいですか?
9154 次
3 に答える
12
seek
次の方法を使用します。
ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);
于 2009-06-26T13:44:28.130 に答える
3
fseek() を使用して、ファイル内の「現在の位置」を目的のオフセットに変更する必要があります。したがって、「f」が FILE* 変数であり、offset がオフセットである場合、呼び出しは次のようになります (私のリーキー メモリをモジュロ):
fseek(f, offset, SEEK_SET);
于 2009-06-26T13:42:49.613 に答える
2
上記の通常のシークアンドリード手法に加えて、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()を覚えておいてください)。
BoostやACEなどのライブラリは、mmap()(および同等のWindows関数)用の優れたC++カプセル化を提供します。
このアプローチは、小さなファイルではおそらくやり過ぎですが、大きなファイルでは大きなメリットになる可能性があります。いつものように、コードのプロファイルを作成して、どのアプローチが最適かを判断します。
于 2009-06-26T18:02:17.860 に答える