Почему я получаю странные результаты с istream :: get (char *, streamsize n, char delim)? - PullRequest
0 голосов
/ 22 декабря 2009

Я читаю в файле в формате, похожем на:

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

Ответы [ 3 ]

2 голосов
/ 22 декабря 2009

попробуйте и посмотрите ..

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');
}
2 голосов
/ 22 декабря 2009

Вы прочитали пустую строку или пытаетесь прочитать за концом файла.

Первый символ \0, обозначающий конец строки.

Любые символы после этого остаются нетронутыми в памяти.

0 голосов
/ 22 декабря 2009

Скорее всего, у вас в конце входного файла есть запятая. или, возможно, более 14 символов пробела после последнего числа в строке.

...