Почему я получаю странные результаты с помощью 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 символов пробелов после последнего числа в строке.