2011-07-20 12 views
22

Estoy usando un iostream estándar para obtener información de un archivo, y estoy confundido acerca de unget() versus . Me parece por la documentación que estas funciones son efectivamente idénticas, donde unget() solo recuerda al personaje puesto, así que estoy nervioso. Siempre he usado putback(character), pero character es siempre el último personaje leído y he estado pensando en cambiar a unget(). ¿Es putback(character) siempre idéntico a unget(), si character es siempre el último carácter leído?Diferencia entre putback() y unget()

Respuesta

16

No puede estar con unget(). "Olvida" el último personaje leído. Puede mentir con putback(c). Puedes "devolver" algún personaje que no sea el último personaje leído. A veces, volver a poner un personaje que no sea el último leído puede ser útil.

Además, si el búfer de lectura subyacente realmente tiene capacidad de búfer, puede "poner" más de un carácter. Creo que ungetc() está limitado a un personaje.

Editar
Nope. Parece que unget() puede ir tan atrás como putback().

+0

No es que me esté quejando de su respuesta perfectamente razonable, pero no creo que realmente responda la pregunta. Si reemplazo todas mis llamadas 'putback (character)' (donde 'character' se garantiza que será el último carácter leído) con' unget() ', ¿el comportamiento definido es idéntico? – Puppy

+2

Seguro que se ve de esa manera para mí. 'putback()' te da la capacidad de poner algo de nuevo que no sea el último personaje leído. Si solo usa 'putsback (last_read_character)', el efecto es lo mismo que llamar a 'unget()', pero sin la garantía explícita de que realmente está "desatando" el último carácter leído. –

+0

Terminé usando una transmisión personalizada de todos modos que puede devolver tantos caracteres como sea necesario. – Puppy

3

No es la respuesta que probablemente espera, pero desea presentar mi razonamiento. La documentación indica que los métodos putback y unget llaman a streambuf::sputbackc y streambuf::sungetc, respectivamente. Las definiciones son las siguientes:

streambuf :: sungetc

Mueve el puntero de conseguir un carácter hacia atrás, haciendo que el último carácter conseguido por una operación de entrada disponible de nuevo para la siguiente operación de entrada.

Durante su funcionamiento, la función llamará a la función miembro virtual protegida pbackfail si el puntero get gptr apunta a la misma posición que el puntero inicial eback.

El otro:

streambuf :: sputbackc

El puntero se mueve hacia atrás llegar a punto al carácter justo antes de su posición actual por lo que el último carácter getten, c, vuelve a estar disponible como el carácter que se leerá en esa posición en la siguiente operación de entrada.

Durante su funcionamiento, la función llama a la función miembro virtual protegida pbackfail si el carácter c no coincide con gptr() [- 1] o si el puntero get gptr apunta a la misma posición que el puntero inicial eback.

Cuando c no coincide con el carácter en esa posición, la definición predeterminada de pbackfail en streambuf antepondrá que c sea el carácter extraído en esa posición si es posible, pero las clases derivadas pueden anular este comportamiento.

función

El miembro sungetc se comporta de una manera similar, pero sin tener ningún parámetro

Como sputbackc llamadas pbackfail si el personaje no coinciden, significa que el método tiene que comprobar si los valores son iguales. Parece que el control adicional es la única sobrecarga, pero no tiene idea de cómo se soluciona en la práctica. Me imagino que si el último personaje no está almacenado en el objeto, entonces tiene que ser releído, por lo que puede esperarlo incluso cuando se garantiza que los caracteres serán los mismos.

Estaba un poco preocupado por la situación cuando llamamos al unget, pero el último carácter no está disponible. ¿El putback pondría el valor correctamente? Dudo, pero no debería ser el caso mientras se trabaja en los archivos.

+0

Parece que hay más de una diferencia. ¿Parece que Putback ya está por delante? ¿Estás seguro de que no reemplaza? Considere la entrada "ABC", si lee A, luego B, luego B de retorno, anteponiendo se insertaría y haría que la corriente de entrada "ABBC". ¿Es esto cierto? –

+1

@ Xaade, depende de la implementación, 'streambuf' no hace nada por defecto. 'stringbuf' reemplaza el carácter en la cadena original (si tiene privilegios de escritura), pero' filebuf' reemplaza al carácter en la memoria interna solamente, por lo que el archivo subyacente no se ve afectado (pero también disminuye el puntero, por lo que no hay efecto de insertar nuevo carácter en corriente). Más detalles en la especificación: http://www.cplusplus.com/reference/iostream/streambuf/pbackfail/. – tomasz