GetLine () إرجاع الخط الفارغ في Eclipse ولكن العمل بشكل صحيح في Dev C ++

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

  •  23-09-2019
  •  | 
  •  

سؤال

ها هو رمزتي:

#include <iostream>
#include <stdlib.h>
#include <fstream>

using namespace std;

int main() {
    string line;
    ifstream inputFile;
    inputFile.open("input.txt");

    do {
        getline(inputFile, line);
        cout << line << endl;
    } while (line != "0");

    return 0;
}

محتوى input.txt:

5 9 2 9 3
8 2 8 2 1
0

في enclipse ، يذهب إلى حلقة لا حصر لها. أنا أستخدم Mingw 5.1.6 + Eclipse CDT.

جربت أشياء كثيرة لكنني لم أجد المشكلة.

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

المحلول

بما أنك على Windows ، حاول:

} while (line != "0\r");

يتم تخزين السطر الأخير على أنه "0\r\n". ال \n يتم استخدامه كحدد الخط بواسطة GetLine بحيث تكون قراءة الخط الفعلي "0\r"

أو

يمكنك تحويل ملف تنسيق DOS إلى تنسيق UNIX باستخدام الأمر

dos2unix input.txt

الآن يجب أن يعمل برنامجك الأصلي. سيغير الأمر \r\n في نهاية الخط \n

كما يجب عليك دائمًا إجراء فحص للخطأ بعد محاولة فتح ملف ، شيء مثل:

inputFile.open("input.txt");
if(! inputFile.is_open()) {
 cerr<< "Error opening file";
 exit(1);
}

نصائح أخرى

سيخلق حلقة لا حصر لها إذا لم يكن هناك خط بالضبط 0. علي سبيل المثال 0\n ليس نفس الشيء مثل 0. أظن أن هذه هي مشكلتك.

تحرير: لتوضيح ، يجب أن يكون Getline هو التخلص من الخط الجديد. ربما يكون ترميز الخط الجديد لملفك خاطئًا (أي Windows مقابل UNIX).

مشكلتك الرئيسية هي دليل العمل.
لأنك تحدد ملفًا باستخدام مسار نسبي يبحث عن الملف من دليل العمل الحالي. يمكن تحديد دليل العمل من خلال بيئة DEV الخاصة بك. (ملاحظة: إن دليل العمل ليس بالضرورة هو نفس الدليل حيث الحياة القابلة للتنفيذ (هذا افتراض شائع بين المبتدئين ولكنه يحمل فقط في ظروف خاصة جدًا)).

على الرغم من أن لديك نهاية خاصة لعلامة الإدخال "0" ، يجب أيضًا التحقق من أن GetLine () لا يفشل (لأنه يمكن أن يخطئ لأسباب أخرى (بما في ذلك الإدخال المنسق Beady). على هذا النحو ، من الأفضل عادةً التحقق من الحالة من الملف كما تقرأه.

int main()
{
    string   line;
    ifstream inputFile;
    inputFile.open("input.txt");

    while((getline(inputfile, line)) && (line != "0"))
    {
        // loop only entered if getline() worked and line !="0"
        // In the original an infinite loop is entered when bad input results in EOF being hit.

        cout << line << endl;
    }
    if (inputfile)
    {
        cout << line << endl; // If you really really really want to print the "0"
                             // Personally I think doing anything with the termination
                             // sequence is a mistake but added here to satisfy comments.
    }

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