كيف أحصل على نتائج غريبة مع ISTream :: Get (Char*، StreamSize N ، Char Delim)؟
-
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 حرفًا من المساحة البيضاء بعد الرقم الأخير على الخط.