C ++ ioStream لا يضع EOF بت حتى لو كان GCOUNT إرجاع 0
سؤال
أقوم بتطوير تطبيق تحت Windows ، وأنا أستخدم FStreams للقراءة والكتابة إلى الملف.
أنا أكتب مع فتح fstream مثل هذا:
fs.open(this->filename.c_str(), std::ios::in|std::ios::out|std::ios::binary);
والكتابة مع هذا الأمر
fs.write(reinterpret_cast<char*>(&e.element), sizeof(T));
إغلاق الملف بعد كل كتابة
fs.close()
القراءة مع ifstream فتح مثل هذا:
is.open(filename, std::ios::in);
والقراءة مع هذا الأمر:
is.read(reinterpret_cast<char*>(&e.element), sizeof(T));
الكتابة تسير على ما يرام. ومع ذلك ، قرأت في حلقة بهذه الطريقة:
while(!is.eof())
{
is.read(reinterpret_cast<char*>(&e.element), sizeof(T));
}
ويستمر البرنامج في القراءة ، على الرغم من أنه يجب الوصول إلى نهاية الملف. ISTellg POS هو 0 ، و GCOUNT يساوي 0 أيضًا ، لكن الفشل والبت كلاهما على ما يرام.
أنا أرغب في هذا المجنون ، وأحتاج إلى بعض المساعدة ...
المحلول
جرب هذا:
while(is.read(reinterpret_cast<char*>(&e.element), sizeof(T))) {}
كما يجب عليك فتح istream
مع ال binary
العلم كذلك:
is.open(filename, std::ios::in | std:ios::binary);
إذا قرأ إلى الأبد ، فماذا يقرأ؟ ما هو نوع T؟
لا تنتمي إلى StackOverflow