¿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;
rdbuf()->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.)