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
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()
.
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ónEl 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.
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? –
@ 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
- 1. MySQL: diferencia entre ', `,' y"
- 2. Diferencia entre objeto y *?
- 3. Diferencia entre. y #
- 4. ¿Diferencia entre == y caso?
- 5. La diferencia entre $ * y $ @
- 6. Diferencia entre & y &
- 7. VBA: Diferencia entre y y +
- 8. Diferencia entre -Wconversion entre gcc y g ++
- 9. Diferencia entre subprocess.Popen y os.system
- 10. Diferencia entre decimal y decimal
- 11. ¿Diferencia entre trazo y relleno?
- 12. Diferencia entre interrupción y eventos
- 13. Diferencia entre netTcpContextBinding y netTcpBinding
- 14. ¿Diferencia entre brújula y sass?
- 15. Diferencia entre "__method__" y "método"
- 16. Diferencia entre Mealy y Moore
- 17. Diferencia entre HashSet y HashMap?
- 18. diferencia entre ajax y enviar
- 19. Diferencia entre sistema y shell_exec
- 20. Diferencia entre Style y ControlTemplate
- 21. Diferencia entre relativo y absoluto
- 22. Diferencia entre window.location.href y top.location.href
- 23. Diferencia entre strncpy y memcpy?
- 24. diferencia entre SDL y GLUT
- 25. Diferencia entre Javascript y PHP
- 26. Diferencia entre Session y HttpContext.Current.Session
- 27. diferencia entre px y em
- 28. Diferencia entre sqrtf y sqrtf
- 29. ¿Diferencia entre Keychain y NSUserDefault?
- 30. Diferencia entre ViewData y TempData?
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
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. –
Terminé usando una transmisión personalizada de todos modos que puede devolver tantos caracteres como sea necesario. – Puppy