efstream تبذل ما وراء النهاية لا يعود eof في vs 2008 اكسبرس؟

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

  •  11-09-2019
  •  | 
  •  

سؤال

في مقابل 2005، لدي بعض التعليمات البرمجية التي تبدو وكأنها:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    loc = ifs.tellg();
    loc += bar.dwHeaderSize;
    // four byte boundary padding
    if ((loc % 4) != 0)
        loc += 4 - (loc % 4);
    ifs.seekg(loc,ios::beg);
}
ifs.close();

عمل الشفرة بشكل جيد في VS 2005، لكنه فشل في VS 2008 Express. من ما يمكنني أن أقول إليه، لا يعيد مقابل 2008 إرجاع EOF () بعد أن يسعى الرمز إلى نهاية الملف. هل فاتني شيء؟ قمت بإصلاحها عن طريق إضافة فحص صريح لمعرفة ما إذا كان موقع البحث تجاوز حجم الملف، لكنني أريد أن أكون متأكدا من أنني أفهم IFstream بشكل صحيح.

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

المحلول

يتم تشغيل علامة EOF فقط بعد محاولة القراءة بعد نهاية الملف.
قراءة upto لن تؤدي نهاية الملف إليها.

هذا هو السبب في أن معظم التعليمات البرمجية يشبه هذا:

while(ifs.read(&bar,sizeof(bar)))
{
     // Do Stuff
}

إذا كانت نتيجة القراءة () تصل إلى EOF سيتم إدخال الحلقة.
إذا كانت نتيجة القراءة () تجاوزت الحلقة الإلكترونية لن يتم إطار

  • ملاحظة: قراءة () لن تذهب فقط في EOF إذا كان هناك صفر بايت اليسار في الملف. وإلا فإنه سيقرأ حتى نهاية الملف. لذلك يتم إدخال الحلقة دائما إذا كان هناك شيء ترك في الملف.

السبب هو نتيجة قراءة (قيمة الإرجاع) هي مرجع إلى الدفق. إذا تم استخدام الدفق في سياق منطقي (مثل تعبير الاختبار)، فسيتم تحويله إلى نوع يمكن استخدامه في مثل هذا السياق. نتيجة هذا التحويل اختبارات العلم EOF (بالإضافة إلى اثنين من الآخرين) وإرجاع الموافقة على FALSE إذا كان EOF صحيحا.

ملحوظة:
تعمل هذه التقنيات بشكل أفضل إذا قمت بتحميل المشغل << بالنسبة لفئة شريطك لأن هذا يجب أن تقرأ بالضبط ما تحتاجه للكائن دون تجاوز EOF. ثم من الأسهل جعل الكائنات الخاصة بك اقرأ بالضبط حتى نهاية الملف دون الذهاب. الشيء الذي تقلق بشأن القراءة مع القراءة هو ما يجب أن يحدث إذا كان القراءة () يريد 10 bytesand هناك فقط 5 بايت في الملف، ماذا يحدث مع الكائن المملوء جزئيا؟

إذا كنت ترغب في الاستمرار في استخدام النمط الخاص بك، يجب أن تبدو الكود مثل هذا:

ifs.open("foo");
while (!ifs.eof())
{
    ifs.read(&bar,sizeof(bar));
    if (ifs.eof())
    {    break;
    }
    // Do Stuff
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top