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