2012-02-19 9 views
15

Un entrevistador me preguntó cómo implementaría tail (sí, el que está en shell de linux). Mi respuesta fue, primero buscar al final del archivo, luego leer los caracteres uno por uno hacia adelante, si encuentra un \n, significa que una línea está inactiva, bla, bla, bla. Supongo que mi respuesta es correcta.¿cuál es la diferencia entre `fseek`,` lseek`, `seekg`,` seekp`?

Entonces me encontré con este problema, que busco debería utilizar para implementar tail? Pensé que simplemente podía usar seekg (C++ cosa?), Pero me dijeron que debería usar lseek (¿llamada al sistema de Linux?).

Incluyendo fseek (cosa de ANSI C?), ¿Cuál debo usar para implementar tail? ¿Y hay alguna gran diferencia entre ellos?

+3

Bastante seguro de 'fseek' es sólo un envoltorio de' lseek' en Linux. –

+0

@JamesMcLaughlin, eso espero. – Alcott

Respuesta

14

Uso seekg cuando se utiliza la biblioteca de C++ iostreams. seekp no sirve para nada, ya que establece el puntero de venta.

Uso fseek cuando se utiliza la biblioteca de C stdio. Use lseek cuando use la E/S del descriptor de archivo POSIX de bajo nivel.

La diferencia entre las diversas funciones buscan es precisamente el tipo de objetos de archivo/corriente en las que operan. En Linux, seekg y fseek probablemente se implementan en términos de lseek.

+0

Entonces, puedo implementar con éxito 'tail' usando 'fseek' en' C' o 'seekg' en' C++ ', ¿verdad? – Alcott

+0

@Alcott: Sí. 'seekg'/IOstreams es la biblioteca de E/S" nativa "de C++, pero stdio puede ser más rápido. Tu elección. –

+0

Estoy usando linux, ¿así que se supone que debo elegir 'lseek' sobre' fseek'? – Alcott

Cuestiones relacionadas