سؤال

لدي مصفوفة X 2 المخزنة في ملف نصي كما هو. أحاول أن أقرأها في C ++

nb_try=0;
fin>>c_tmp>>gamma_tmp;
while (!fin.eof( ))      //if not at end of file, continue reading numbers
{
  // store
  cs_bit.push_back(c_tmp);
  gammas_bit.push_back(gamma_tmp);
  nb_try++;

  // read
  fin>>c_tmp;
  assert(!fin.fail( )); // fail at the nb_try=n   
  if(fin.eof( ))break;
  fin>>gamma_tmp; // get first number from the file (priming the input statement)
  assert(!fin.fail( ));    

}

فشل أول تأكيد، أي fin.fail () صحيح، عندما nb_try == n، الذي يحدث عندما يحاول قراءة الرقم الأول غير موجود. ولكن كيف يأتي fin.eof () غير صحيح بعد قراءة العدد الأخير؟ هل يعني أنه يصبح صحيحا فقط عند قراءة الرقم الأول الذي يوجد به OT؟ هل صحيح أيضا أن fin.fail () و fin.eof () أصبحت حقيقية في نفس الوقت؟

شكرا مع تحياتي!

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

المحلول

هذه هي الطريقة الخطأ لقراءة ملف:

while (!fin.eof( ))
{
      // readLine;
      // Do Stuff
}

النمط القياسي هو:

while(getlineOrValues)
{
    // Do Stuff
}

لذا النظر إلى التعليمات البرمجية الخاصة بك بسرعة أعتقد أنه سيكون Asier من كتابة ذلك على النحو التالي:

while(fin>>c_tmp>>gamma_tmp)
{
    // loop only eneterd if both c_tmp AND gamma_tmp
    // can be retrieved from the file.

    cs_bit.push_back(c_tmp);
    gammas_bit.push_back(gamma_tmp);
    nb_try++;   
} 

المشكلة هي أن eof صحيح فقط بعد تحاول وقراءة الماضي. عدم وجود شخصية متبقية في الملف لقراءة ليست هي نفسها EOF كونها صحيحة. لذلك تقرأ السطر الأخير والحصول على القيم وليس هناك شيء يترك للقراءة، ولكن EOF لا يزال خاطئا حتى يتم إعادة رمز التعليمات البرمجية. عندما يحاول وقراءة C_TMP، يتم تشغيل EOF وإلى تأكيدك في شكل الكمثرى.

الحل هو وضع القراءة حسب الحالة. نتيجة للقياءة القراءة هي الدفق. ولكن عندما يتم استخدام الدفق في سياق منطقي (مثل الحالة الزمنية)، يتم تحويله إلى نوع يمكن استخدامه مثل BOOL (من الناحية الفنية من الناحية الفنية * ولكن هذا غير مهم).

نصائح أخرى

IIRC، لا يتم ضبط Eofbit حتى تحاول في الواقع القراءة بعد نهاية الملف. وهذا هو، بمجرد الوصول إلى نهاية الملف، عليك أن تقرأ وقتا آخر قبل تعيين هذه العلامة.

إذا كان الملف النصي يحتوي على هذا التسلسل، بدون علامات اقتباس، "12345 67890"، ثم سيعود # 3 خطأ، ولكن # 4 سيعود صحيحا لأنه لا توجد مسافة بيضاء بعد الرقم الأخير:

int i;
bool b;

fin >> i;

b = fin.fail();  // 1
b = fin.eof();   // 2

fin >> i;

b = fin.fail();  // 3
b = fin.eof();   // 4

fin >> i;

b = fin.fail();  // 5
b = fin.eof();   // 6

ومع ذلك، إذا كان التسلسل هو "12345 6789" (لاحظ المساحة بعد العدد الأخير)، ثم # 3 و # 4 هل سيعود كلا من كاذبة خطأ، ولكن # 5 و # 6 سيعود صحيحا.

يجب عليك التحقق من كل من EOF () وفشل () وإذا كان كلاهما صحيحا، فلن يكون لديك المزيد من البيانات. إذا فشل () صحيحا، ولكن EOF () خطأ، فهناك مشكلة في الملف.

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