سؤال

وأنا أكتب مكتبة C الذي يقرأ ملف في الذاكرة. فإنه يتخطى بايت 54 الأولى من الملف (رأس) ثم يقرأ ما تبقى كبيانات. يمكنني استخدام fseek لتحديد طول الملف، ومن ثم استخدام fread لقراءة في الملف.

وحلقة تدير مرة واحدة ثم تنتهي لأن الوصول إلى EOF (عدم وجود أخطاء). في النهاية، bytesRead = 10624، ftell (تيار) = 28726، والمخزن المؤقت يحتوي على 28726 القيم. أتوقع fread لقراءة 30000 بايت والموقف ملف ليكون 30054 عندما يتم التوصل إلى EOF.

وC ليس لغتي الأم حتى أظن أنني قد حصلت على خطأ المبتدئين البكم في مكان ما.

والرمز هو كما يلي:

const size_t headerLen = 54;

FILE * stream;
errno_t ferrno = fopen_s( &stream, filename.c_str(), "r" );
if(ferrno!=0) {
  return -1;
}

fseek( stream, 0L, SEEK_END );
size_t bytesTotal = (size_t)(ftell( stream )) - headerLen; //number of data bytes to read
size_t bytesRead = 0;
BYTE* localBuffer = new BYTE[bytesTotal];
fseek(stream,headerLen,SEEK_SET);
while(!feof(stream) && !ferror(stream)) {
    size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-bytesRead,stream);
    bytesRead+=result;
}

واعتمادا على المرجع الذي تستخدمه، فمن الواضح تماما أن إضافة "ب" للعلم وضع هو الجواب. البحث عن الترشيحات لشخص أحمق الشارة. : -)

هذا المرجع محادثات حول هذا الموضوع في الفقرة الثانية، الجملة الثانية (ولكن ليس في الجدول بهم).

MSDN لا يناقش ثنائي العلم حتى في منتصف الطريق إلى أسفل الصفحة.

OpenGroup يذكر الوجود من "ب" العلامة، ولكن تنص على أنه "لن يكون لها أي تأثير".

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

المحلول

وربما انها مسألة وضع الثنائية. حاول فتح الملف مع "r+b" كوضع.

تعديل : في. كما لوحظ في "rb" تعليق غير المرجح مباراة أفضل لنية الأصلي منذ "r+b" وفتحه للقراءة / كتابة و"rb" للقراءة فقط

نصائح أخرى

والجدير بالذكر أيضا أن مجرد بما في ذلك binmode.obj في قيادة صلتك سوف نفعل ذلك لك لفتح كل ملف.

وهناك حل، استنادا إلى الأجوبة السابقة:

    size_t bytesRead = 0;
    BYTE* localBuffer = new BYTE[bytesTotal];
    fseek(stream,headerLen,SEEK_SET);
        while(!feof(stream) && !ferror(stream)) {
        size_t result = fread(localBuffer+bytesRead,sizeof(BYTE),bytesTotal-
        bytesRead,stream);
    bytesRead+=result;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top