Este código recorre siempre:¿Cuándo `ifstream :: readsome` establece` eofbit`?
#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);
}
}
Es porque se readsome
configuración Nunca eofbit
.
cplusplus.com dice:
errores se señalizan mediante la modificación de las banderas de estado internas:
eofbit
La conseguir puntero se encuentra al final del interno matriz de entrada del búfer de la secuencia cuando se invoca la función, significado que no hay posiciones para ser leer en el búfer interno (que puede ser o no el final de la secuencia de entrada ). Esto ocurre cuandordbuf()->in_avail()
devolvería-1
antes de que se extraiga el primer carácter .
failbit
La secuencia estaba al final de la fuente de caracteres antes de llamar a la función .
badbit
Se produjo un error diferente al anterior.
Casi la misma, 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()
llama alsetstate(failbit)
, que puede generar una excepción y devolver. De lo contrario, extrae los caracteres y los almacena en ubicaciones sucesivas de una matriz cuyo primer elemento se designa cons
. Sirdbuf()->in_avail() == -1
, llama alsetstate(eofbit)
(que puede arrojarios_base::failure
(27.5.5.4)), y extrae sin caracteres;
- Si
rdbuf()->in_avail() == 0
, extractos ningún carácter- If
rdbuf()->in_avail() > 0
, extractosmin(rdbuf()->in_avail(),n))
.33. Devoluciones: Número de caracteres extraídos.
que la condición in_avail() == 0
es un no-op implica que ifstream::readsome
sí mismo es un no-op si el búfer de la secuencia está vacía, pero la condición in_avail() == -1
implica que se establecer eofbit
cuando alguna otra operación tiene llevado a in_avail() == -1
.
Esto parece una incoherencia, incluso a pesar de la naturaleza "algo" de readsome
.
Entonces, ¿qué son la semántica de readsome
y eof
? ¿Los he interpretado correctamente? ¿Son un ejemplo de diseño deficiente en la biblioteca de secuencias?
(robado de la [OMI] inválido libstdc++ bug 52169.)
Gracias; ¡eso ayuda! –