سؤال

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

int main() {

    ifstream inFile;
    int result;
    string filename;

    cout << "If the executable is not in the same directory as the\nfile, then a directory needs to be provided\n\n";
    while (true) {
        cout << "Enter the file name:  ";
        getline(cin, filename);
        inFile.open(filename.c_str(), ios::in);

        if (!inFile)
            cout << "\n**File failed to open**\n\n";
        else break;
    }

    result = countLOC(inFile);
    cout << "\nThere are " << result << " lines of code in \"" << filename << "\"\n\n";

    inFile.close();
    return 0;
}
هل كانت مفيدة؟

المحلول

وذلك لأن بتات الخطأ في الكائن "Infile" قد تم تعيين.
تحتاج إلى إعادة تعيين بتات الخطأ قبل أن تفعل أي شيء آخر.

if (!inFile)
{
    cout << "\n**File failed to open**\n\n";
    inFile.clear();
}
else break;

نصائح أخرى

يتصل صافي لإعادة تعيين الحالة قبل الاتصال لفتح.

لا تحتاج حقا إلى الاستفادة من إشارات الأخطاء وما إلى ذلك، يمكنك فقط استدعاء وظيفة Infile.is_open () للتحقق. لن تحتاج إلى استخدام infile.clear () أيضا.

نعم تفعل واضح

إذا كان المستخدم يوفر دليلا تحتاج إلى القيام ب FindFirst و FindNext

msdn.microsoft.com/en-us/library/zyzxfzac(vs.71).aspx.

ومعالجة جميع الملفات بهذه الطريقة.

مسحها. أيضا، لا تحتاج إلى استراحة في حلقة الخاص بك، أود أن أقترح هذا بدلا من ذلك:

do {
    if (infile.fail())
       cout << "\n**File failed to open**\n\n";
    infile.clear()
    cout << "Enter the file name:  ";
    getline(cin, filename);
    inFile.open(filename.c_str(), ios::in);
} while(!infile)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top