سؤال

لدي هذه الوظيفة لقراءة جميع ints من الملف.المشكلة هي عندما أقرأ الحروف أقوم بتشغيل سطر جديد وأسعى دائمًا إلى الرقم 1 وليس حتى نهاية السطر.كيف يمكنني كتابة هذه الوظيفة بشكل أفضل؟

int v;
    while (!in.eof())
    {
        while (in >> v)
            cout << v << " ";

        cout << endl;
        if (in.eof())
            break;
        in.clear();
        in.seekg(1, ios::cur);
        int a;
        a=0;
    }
هل كانت مفيدة؟

المحلول

إذا ويتكون الملف من [إينتس] فقط مفصولة بيضاء (بما في ذلك) أسطر جديدة ثم وهذا ينبغي أن يكون كافيا.

while( in >> v )
{
    // do something with v
}

وبعد الملف، إذا in.fail () هو زائف وin.eof () غير صحيح، فهذا يعني انك وصلت إلى نهاية الملف بدون خطأ التنسيق. وإلا خطأ في قراءة عدد صحيح وقعت.

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

in.clear();
in.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );

نصائح أخرى

المشكلة الأولى أن الكود أعلاه لا يتوقف عند نهاية السطر.
يتجاهل عامل التشغيل >>() "شخصيات المساحة البيضاء" والذي يتضمن حرف السطر الجديد.

كيف يمكن كتابة هذا بشكل أفضل؟
من الصعب معرفة ذلك دون معرفة ما تحاول فعله بالأرقام وتنسيق إدخال الملف!

لكن لو كنت أكتب هذا لكتبته دون استخدام هذه السطور:

    if (in.eof())
            break;
    in.clear();
    in.seekg(1, ios::cur);

عند معالجة ملف نصي منسق، من النادر رؤية استخدام البحث ().

افترض:
الملف يحتوي على ارقام فقط
تريد قراءة جميع الأرقام في حاوية.

std::vector<int>    data;

std::copy(  std::istream_iterator<int>(in),  // An iterator from current point
            std::istream_iterator<int>(),    // To end of file.
            std::inserter(data)              // Destination (insert into data)
         );
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top