كيف يمكنني استخدام basic_filebuf مع نوع عنصر آخر غير char؟
سؤال
لنفترض أنني أريد قراءة محتويات الملف باستخدام 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