Como é que estou obtendo resultados estranhos com o iStream :: get (char*, streamsize n, char delim)?

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

  •  20-09-2019
  •  | 
  •  

Pergunta

Estou lendo em um arquivo com um formato semelhante a:

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

etc, e código semelhante ao seguinte:

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);

Lê na primeira coluna multa durante a maior parte do tempo. No entanto, ocasionalmente, o SSCANF falha e, quando verifico o que está no buffer usando o depurador de codegear, vejo que ele leu em \000:00:023 por exemplo. Por algum motivo, está coletando um personagem nulo,\0, na frente. Quando olho no arquivo de texto, ele parece ser o mesmo formato que todos os outros valores de tempo que foram lidos corretamente. Por que ocasionalmente está adicionando um personagem nulo? E há uma vida por aí?

Foi útil?

Solução

Você leu uma linha em branco ou está tentando ler além do final do arquivo.

O primeiro personagem é \0, que significa o final da string.

Quaisquer personagens depois disso são memória intocada.

Outras dicas

tente isso e veja ..

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');
}

Provavelmente, você tem uma vírgula à direita em seu arquivo de entrada em algum lugar. Ou talvez mais de 14 caracteres de espaço em branco após o último número em uma linha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top