8

これで、多くのデータを含むファイルができました。そして、必要なデータが位置 (long)x から始まり、指定されたサイズ sizeof(y) であることを知っています。このデータを取得するにはどうすればよいですか?

4

3 に答える 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 に答える