2011-07-23 10 views
8

27.6.3.4.2 gestión de memoria intermedia y el posicionamientobasic_streambuf :: seekoff lo que debe devolverse cuando ios_base :: in | ios_base :: out está especificado?

pos_type seekoff(off_type off, ios_base::seekdir way, 
    ios_base::openmode which = ios_base::in | ios_base::out); 
  • Efectos: altera las posiciones de transmisión en el plazo de una o más de las secuencias de controlados de una manera que se define por separado para cada clase derivado de basic_streambuf en esta cláusula (27.8.2.4, 27.9.1.5).
  • Comportamiento predeterminado: Devuelve pos_type(off_type(-1)).

Hasta ahora, muy bien. La derivación basic_streambuf que estoy usando puede alterar su posición por separado para ios_base::in y/o ios_base::out. Pero, ¿qué debo devolver cuando se especifican ambos?

Si especifica ios_base::inoios_base::out, que volvería nueva posición corriente de la secuencia específica.

+0

"_in una manera que se define por separado para cada class_" es que una especificación, o una broma? – curiousguy

+0

@curiousguy - Incluso si suena raro, de hecho es una especificación. Permite que las clases derivadas se comporten de una manera sensata que puede variar entre diferentes implementaciones y casos de uso. Sin embargo, no siempre es intuitivo cómo una implementación "debería" comportarse. – 0xbadf00d

+0

"_de hecho es una especificación_" Pero no lo es. Es una alusión a alguna otra especificación en otro lugar. "_ Permite que las clases derivadas se comporten de una manera sensata que puede variar entre diferentes implementaciones y casos de uso." ¿Cuál es el objetivo de esta "especificación"? ¿Qué se puede hacer sabiendo que 'seekoff' altera las posiciones del flujo dentro de una o más de las secuencias controladas de una manera que se define por separado para cada clase derivada? – curiousguy

Respuesta

1

Le corresponde un poco a su flujo definir lo que sucede. Las transmisiones incorporadas difieren, en que algunas pueden tener posiciones separadas de lectura y escritura (cadena de caracteres) mientras que otras solo tienen una (corriente ascendente).

Si el usuario realiza una reposición y especifica tanto dentro como fuera, quizás deba mover ambas. Si es una búsqueda con un desplazamiento cero para obtener la posición actual, no es irrazonable fallar si las posiciones son diferentes.

+0

Otra opción sería mover ambas por el desplazamiento, pero no sé qué debería devolver. Creo que tienes razón y sería más razonable fracasar si las posiciones son diferentes. – 0xbadf00d

0

Después de buscar fuera de 27.8.2.4 parece que se espera que falle.

consultar la tabla de condición 130, que establece que ambas secuencias de entrada y salida deben colocar sólo si

(which & (ios_base::in | ios_base::out)) == (ios_base::in) | ios_base::out)) 
and way == either ios_base::beg or ios_base::end 
Cuestiones relacionadas