سؤال

والآن لدي ملف مع العديد من البيانات فيه. وأنا أعلم أن البيانات أحتاج يبدأ في موقف (الطويل) x و لديه sizeof حجم معين (ص) كيف يمكنني الحصول على هذه البيانات؟

هل كانت مفيدة؟

المحلول

استخدم طريقة seek:

ifstream strm;
strm.open ( ... );
strm.seekg (x);
strm.read (buffer, y);

نصائح أخرى

ويجب عليك استخدام fseek () لتغيير "الوضع الحالي" في الملف إلى المنشودة الإزاحة. لذا، إذا "و" الخاص بك هو FILE * متغير وتعويض هو الإزاحة هذه هي الطريقة الدعوة يجب أن تبدو (MODULO ذاكرتي راشح):

fseek(f, offset, SEEK_SET);

وإلى جانب تقنيات المعتادة يسعى وقراءة المذكورة أعلاه، يمكنك أيضا تعيين الملف إلى مساحة العملية باستخدام شيء من هذا القبيل <لأ href = "http://www.opengroup.org/onlinepubs/000095399/functions/mmap هتمل "يختلط =" نوفولو noreferrer "> mmap () و الوصول إلى البيانات مباشرة.

وعلى سبيل المثال، نظرا لملف البيانات التالية "foo.dat":

one two three

والتعليمة البرمجية التالية ستطبع عن النص بعد بايت الأربعة الأولى باستخدام mmap () النهج القائم على:

#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 توفر لطيفة التلخيصات C ++ لmmap () (وظيفة ويندوز ما يعادلها).

وهذا النهج هو ربما مبالغة لملفات صغيرة، ولكن يمكن أن يكون مكسبا كبيرا لملفات كبيرة. كما جرت العادة، ملف التعليمات البرمجية لتحديد النهج الذي هو أفضل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top