write read open example definicion c++ position binaryfiles fstream

c++ - read - ¿Son "seekp" y "seekg" intercambiables?



read file c++ line by line (2)

Bueno, acabo de notar que al cambiar la posición en microsoft visual studio a través de "seekp", implícitamente también cambio la posición de lectura cuando se manejan archivos.

Me pregunto, sin embargo, si este es un comportamiento "portátil"? ¿Puedo esperar que la posición de lectura y escritura sea siempre la misma? Y en consecuencia: ¿ tellp & tellg siempre devolverá el mismo valor?


Para las posiciones de archivo son las mismas. En otras palabras, solo hay un puntero mantenido.

Desde 27.9.1.1p3 :

Se mantiene una posición conjunta del archivo tanto para la secuencia de entrada como para la secuencia de salida.

Por lo tanto, seekg y seekp son intercambiables por secuencias de archivos. Sin embargo, esto no es cierto para otros tipos de flujos, ya que pueden contener punteros separados para las posiciones de poner y obtener.


Actualización: Entonces, de todos los comentarios y todo, parece que para fstream, seekp y seekg usan el mismo puntero. Pero para el flujo de cadenas y probablemente otras transmisiones no basadas en archivos, son independientes.

Mensaje original:

No funciona para mí en Linux con g ++ 4.7.2. Parecen ser independientes:

#include <sstream> #include <iostream> int main(int, char**) { std::stringstream s("0123456789"); std::cout << "put pointer: " << s.tellp() << std::endl; std::cout << "get pointer: " << s.tellg() << std::endl; std::cout << std::endl; s.seekp(2); std::cout << "put pointer: " << s.tellp() << std::endl; std::cout << "get pointer: " << s.tellg() << std::endl; std::cout << std::endl; s.seekg(4); std::cout << "put pointer: " << s.tellp() << std::endl; std::cout << "get pointer: " << s.tellg() << std::endl; std::cout << std::endl; }

Salida:

put pointer: 0 get pointer: 0 put pointer: 2 get pointer: 0 put pointer: 2 get pointer: 4

También el comportamiento que usted describe suena como que no cumple con las citas here :

Establece la posición del puntero obtener. El puntero de obtención determina la siguiente ubicación que se leerá en la fuente asociada a la transmisión.

y here :

Establece la posición del puntero puesto. El puntero de colocación determina la ubicación en la secuencia de salida donde se realizará la siguiente operación de salida.