Почему я получаю странные результаты с помощью 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