كيف أحصل على نتائج غريبة مع ISTream :: Get (Char*، StreamSize N ، Char Delim)؟

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

  •  20-09-2019
  •  | 
  •  

سؤال

أنا أقرأ في ملف بتنسيق مشابه لـ:

TIME, x, y, z
00:00:00.000 , 1, 2 , 3
00:00:00.001 , 2 , 3 , 4

وما إلى ذلك ، ورمز مشابه لما يلي:

std::ifstream& istream;
char buffer[15];
double seconds, hours, mins; // initialised properly in real code

// to read in first column
istream.get(buffer, 14, ',');

int scanned = std::sscanf(buffer, "%d:%d:%lf", &hours, &mins, &seconds);

يقرأ في العمود الأول غرامة لمعظم الوقت. ومع ذلك ، في بعض الأحيان فشل SSCANF ، وعندما أتحقق من ما هو موجود في المخزن المؤقت باستخدام مصحح تصحيح Codegear ، أرى أنه قد قرأ في \000:00:023 علي سبيل المثال. لسبب ما يجمع شخصية فارغة ،\0, ، في المقدمة. عندما أنظر في الملف النصي ، يبدو أنه نفس التنسيق مثل جميع قيم الوقت الأخرى التي تمت قراءتها بشكل صحيح. لماذا تضيف أحيانًا شخصية فارغة؟ وهل هناك عمل؟

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

المحلول

لقد قرأت سطرًا فارغًا ، أو تحاول قراءة نهاية الملف.

الشخصية الأولى \0, ، مما يدل على نهاية السلسلة.

أي شخصيات بعد ذلك هي ذاكرة لم تمسها.

نصائح أخرى

جرب هذا وانظر ..

ifstream inpfile("sample.txt");
char buffer[15];
inpfile.ignore(80, '\n');
while (!inpfile.eof())
{

    inpfile.get(buffer, 14, ',');
    int hrs, mins;
    double secs;
    hrs = mins = secs = -1;
    sscanf_s(buffer, "%d:%d:%lf", &hrs, &mins, &secs);
    cout << "hrs:" << hrs << "\t"
        << "mins:" << mins << "\t"
        << "secs:" << secs 
        << endl;
    inpfile.ignore(80, '\n');
}

على الأرجح لديك فاصلة زائدة في ملف الإدخال الخاص بك في مكان ما. أو ربما أكثر من 14 حرفًا من المساحة البيضاء بعد الرقم الأخير على الخط.

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