كيف يمكنني اكتشاف/التحكم في مستوى التخزين المؤقت الداخلي في تدفق C++ fstream؟

StackOverflow https://stackoverflow.com/questions/351582

  •  20-08-2019
  •  | 
  •  

سؤال

لنفترض أنني أفعل هذا (مثال مفتعل):

#include <iostream>
#include <fstream>

using namespace std;

int main(int argc, char* argv[])
{
    ifstream ifs(argv[1]);

    char ch;
    while(ifs.read(&ch, 1)) {
        cout << ch;
    }
}

أفترض (آمل) أن تقوم مكتبة iostream ببعض التخزين المؤقت الداخلي هنا ولا تحول هذا إلى أعداد كبيرة من عمليات قراءة الملفات ذات البايت الواحد على مستوى نظام التشغيل.

هل هناك طريقة:

أ) معرفة حجم المخزن المؤقت الداخلي لـ ifstream؟

ب) هل تريد تغيير حجم المخزن المؤقت الداخلي لـ ifstream؟

أنا أكتب مرشحًا للملفات يحتاج إلى قراءة ملفات متعددة الجيجابايت في أجزاء صغيرة وأرغب في تجربة أحجام مختلفة من المخزن المؤقت لمعرفة ما إذا كان ذلك يؤثر على الأداء.

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

المحلول

يمكنك استخدام ios::rdbuf() للحصول على مؤشر إلى أ streambuf هدف.يمثل هذا الكائن المخزن المؤقت الداخلي للتيار.

تستطيع الاتصال streambuf::pubsetbuf(char * s, streamsize n) لتعيين مخزن مؤقت داخلي جديد بحجم معين.

يرى هذا الرابط لمزيد من التفاصيل.

يحرر: إليك كيف سيبدو الأمر في حالتك:


#include <iostream>
#include <fstream>
using namespace std;

int main(int argCount, char ** argList[])
{
    ifstream inStream(argList[1]);

    char myBuffer [512];
    inStream.rdbuf()->pubsetbuf(myBuffer, sizeof(myBuffer));

    char ch;
    while(inStream.read(&ch, 1))
    {
        cout << ch;
    }
}

يحرر: كما أشار litb, ، السلوك الفعلي streambuf::pubsetbuf هو "محدد بالتنفيذ".

إذا كنت تريد حقًا التلاعب بالمخازن المؤقتة، فقد تضطر إلى إنشاء فئة التخزين المؤقت الخاصة بك والتي ترث منها streambuf.

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