Quando `ifstream :: readsome` define` eofbit`?

Este código faz um loop para sempre:

#include <iostream>
#include <fstream>
#include <sstream>

int main(int argc, char *argv[])
{
    std::ifstream f(argv[1]);
    std::ostringstream ostr;

    while(f && !f.eof())
    {
        char b[5000];
        std::size_t read = f.readsome(b, sizeof b);
        std::cerr << "Read: " << read << " bytes" << std::endl;
        ostr.write(b, read);
    }
}

É porquereadsome nunca está definindoeofbit.

cplusplus.com diz:

s espelhos são sinalizados modificando os sinalizadores de estado intern

eofbit O ponteiro get fica no final da matriz de entrada interna do buffer de fluxo quando a função é chamada, o que significa que não há posições a serem lidas no buffer interno (que pode ou não ser o fim da sequência de entrada). Isso acontece quandordbuf()->in_avail() retornaria-1 antes que o primeiro caractere seja extraíd

failbit O fluxo estava no final da fonte de caracteres antes da função ser chamada.

badbit Ocorreu um erro diferente do acim

Quase o mesmo, o padrão diz:

[C++11: 27.7.2.3]: streamsize readsome(char_type* s, streamsize n);

32. Efeitos: Comporta-se como uma função de entrada não formatada (conforme descrito em 27.7.2.3, parágrafo 1). Depois de construir um objeto sentinela, se!good() callssetstate(failbit) que pode gerar uma exceção e retornar. Caso contrário, extrai caracteres e os armazena em locais sucessivos de uma matriz cujo primeiro elemento é designado pors. E serdbuf()->in_avail() == -1, chamasetstate(eofbit) (que pode gerarios_base::failure (27.5.5.4)) e não extrai caracteres;

E serdbuf()->in_avail() == 0, não extrai caracteresE serdbuf()->in_avail() > 0, extraimin(rdbuf()->in_avail(),n)).

33. Retorna: O número de caracteres extraídos.

Que oin_avail() == 0 é uma condição não operacional implica queifstream::readsome em si não funciona se o buffer do fluxo estiver vazio, mas oin_avail() == -1 condição implica queva seteofbit quandoalguma outra operação levou ain_avail() == -1.

Isso parece uma inconsistência, apesar da natureza "alguma" dereadsome.

E daíestamo a semântica dereadsome eeof? Eu os interpretei corretamente? Eles são um exemplo de design deficiente na biblioteca de fluxos?

(Roubado do [IMO] inválido libstdc ++ bug 52169.)

questionAnswers(8)

yourAnswerToTheQuestion