كيف يمكنني استخدام basic_filebuf مع نوع عنصر آخر غير char؟

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

  •  07-07-2019
  •  | 
  •  

سؤال

لنفترض أنني أريد قراءة محتويات الملف باستخدام basic_filebuf.لدي نوع يسمى boost::uintmax_t الذي يبلغ حجمه 8 bytes.أحاول أن أكتب ما يلي:

typedef basic_filebuf<uintmax_t> file;
typedef istreambuf_iterator<uintmax_t> ifile;

file f;
vector<uintmax_t> data, buf(2);

f.open("test.txt", std::ios::in | std::ios::binary);
f.pubsetbuf(&buf[0], 1024);

ifile start(&f), end;
while(start != end)
{
    data.push_back(*start);
    start++;
}

المشكلة هي أن بعض bytes اقرأ، والبعض الآخر لا يفعل ذلك.على سبيل المثال، لنفترض أن هناك 9 bytes في الملف مرقمة 1-9:

|1|2|3|4|5|6|7|8|9|

عندما أقوم بتشغيل التعليمات البرمجية أعلاه، يتم دفع عنصر واحد فقط إلى الخلف data, ، الذي يحتوي على 4 bytes فقط من البيانات الأصلية في f:

[0|0|0|0|4|3|2|1] --> only element in [data]

ما الخطأ الذي افعله؟هذه هي المرة الأولى لي للاستخدام basic_filebuf مباشرة، على الرغم من أنني أعرف كيفية استخدامها filebuf.

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

المحلول

يتعامل ملف basic_filebuf مع نوع الحرف "الداخلي" ونوع الحرف "الخارجي"."الخارجي" هو محتويات الملف، وهو دائمًا بايت.المعلمة "الداخلية" هي معلمة القالب، وهي المعلمة المستخدمة في واجهتها مع البرنامج.للتحويل بين الاثنين، يستخدم basic_filebuf واجهة codecvt الخاصة بالإعدادات المحلية الخاصة به.

لذلك، إذا كنت تريد منه أن يكتب مباشرة وحدات البايت التي تقدمها له، فلديك خياران:

  • استخدم برنامج الترميز "المنحط" الذي يقوم فقط بالتحويل بين الترميزين "الداخلي" و"الخارجي" بدلاً من محاولة إجراء التحويل.
  • استخدم basic_filebuf، وتأكد من استخدام اللغة "الكلاسيكية"، وقم بإجراء عملية الإرسال لتشار بنفسك

نصائح أخرى

<اقتباس فقرة>   

وكائنات من نوع basic_filebuf هي   تم إنشاؤها باستخدام المخزن المؤقت الداخلي لل   اكتب حرف * بغض النظر عن   char_type التي يحددها نوع   المعلمة إيليم. وهذا يعني أن   سلسلة يونيكود (التي تحتوي على wchar_t   حرفا) سيتم تحويلها إلى   ANSI سلسلة (التي تحتوي على حرف   حرفا) قبل الكتابة ل   المخزن المؤقت الداخلي. لتخزين يونيكود   سلاسل في المنطقة العازلة، وخلق جديد   عازلة من نوع wchar_t وضعه   باستخدام basic_streambuf :: pubsetbuf ()   الأسلوب.

http://msdn.microsoft.com /en-us/library/tzf8k3z8(VS.80).aspx

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