¿Cuándo `ifstream :: readsome` establece` eofbit`?

Este código se repite para siempre:

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

Eso es porquereadsome nunca está configurandoeofbit.

cplusplus.com dice

os errores se señalan modificando los indicadores de estado internos:

eofbit El puntero get está al final de la matriz de entrada interna del búfer de flujo cuando se llama a la función, lo que significa que no hay posiciones para leer en el búfer interno (que puede o no ser el final de la secuencia de entrada). Esto sucede cuandordbuf()->in_avail() volvería-1 antes de extraer el primer carácter.

failbit La secuencia estaba al final de la fuente de caracteres antes de que se llamara a la función.

badbit Ha ocurrido un error diferente al anterior.

Casi lo mismo, el estándar dice:

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

32. Efectos: Se comporta como una función de entrada sin formato (como se describe en 27.7.2.3, párrafo 1). Después de construir un objeto centinela, si!good() llamadassetstate(failbit) que puede lanzar una excepción y volver. De lo contrario, extrae caracteres y los almacena en ubicaciones sucesivas de una matriz cuyo primer elemento está designado pors. Sirdbuf()->in_avail() == -1, llamadassetstate(eofbit) (que puede arrojarios_base::failure (27.5.5.4)), y no extrae caracteres;

Sirdbuf()->in_avail() == 0, no extrae caracteresSirdbuf()->in_avail() > 0, extractosmin(rdbuf()->in_avail(),n)).

33. Devoluciones El número de caracteres extraídos.

Que elin_avail() == 0 condición es un no-op implica queifstream::readsome en sí mismo es un no-op si el búfer de flujo está vacío, pero elin_avail() == -1 condición implica queser seteofbit cuando alguna otra operación ha llevado ain_avail() == -1.

Esto parece una inconsistencia, incluso a pesar de la naturaleza "algo" dereadsome.

Y quéso la semántica dereadsome yeof? ¿Los he interpretado correctamente? ¿Son un ejemplo de diseño deficiente en la biblioteca de secuencias?

(Robado de [IMO] inválido libstdc ++ bug 52169.)

Respuestas a la pregunta(8)

Su respuesta a la pregunta