2012-06-23 77 views
5

Quiero proporcionar una capacidad de tabulación para flujos de salida de texto en C++. La función debería permitirme decir "anotar esta posición", luego permitir múltiples operaciones de inserción, y finalmente permitirme decir "agregar suficientes caracteres de relleno para terminar con N caracteres más allá de la posición notada originalmente".¿por qué cout.tellp siempre devuelve -1?

El sistema estándar iostream no parece mantener una posición de columna, pero pensé que podría falsificarlo usando tellp(). Mi suposición era que la diferencia entre tellp() en dos puntos en mi secuencia de salida correspondería a la cantidad de bytes intermedios.

Lamentablemente, al menos en mi entorno Gnu C++, cout no mantiene la ficción de una posición de secuencia. Cada cout.tellp() llama al returns -1. ¿Porqué es eso?

+6

'tellp' nunca es una posición de la columna en cualquier corriente. Solo es significativo en las corrientes buscables. –

+1

@ R.MartinhoFernandes es correcto. 'tellp' se supone que te dice qué valor proporcionar a' seekp' para volver a la posición actual. En este caso, te está diciendo que no hay tal posibilidad. Entabbing tiene que ser apoyado de otra manera. –

+0

Gracias a los dos. Fue la relación de búsqueda que no logré comprender. –

Respuesta

2

tellp devuelve una posición en una secuencia para que pueda buscarla. La consola no permite buscar. Además, incluso si interpreta la posición como "el número de bytes escritos en la secuencia desde que se creó", ese número no será útil para el posicionamiento del cursor: la pantalla se ajusta, su ancho generalmente es impredecible. Simplemente no sabrá en qué columna se encuentra, ya que la longitud de la fila es variable.

Si desea un posicionamiento razonable del cursor en la pantalla, consulte la especificación del terminal ANSI y los comandos de escape que vienen con él. Permiten el descubrimiento y la ubicación de la posición del cursor.

http://ascii-table.com/ansi-escape-sequences.php

+0

Gracias Seva. Fue la relación entre seekp y tellp que no logré comprender. –

+0

Gracias @Seva. No estoy tratando de hacer la manipulación del cursor. Para alignmnet, simplemente quería emitir valores justificados a la izquierda con signos de puntuación finales en columnas de ancho de corrección (por ejemplo, "1:" y "12:"). Debido a que esto implica más que una única operación de inserción, el manipulador de ancho estándar() es insuficiente. Si vuelves a leer mi pregunta original, verás que no tenía la intención de interpretar a tellp() como una posición de columna. Fue la diferencia entre dos llamadas a tellp() que esperaba que me permitiera determinar cuántos bytes se habían insertado entre ellos. –

Cuestiones relacionadas