2012-02-19 11 views
15

Zostałem poproszony przez ankietera, że ​​jak zaimplementować tail (tak, ten w powłoce linux). Moja odpowiedź brzmiała: najpierw postaraj się o koniec pliku, a następnie odczytuj znaki jeden po drugim naprzód, jeśli napotka na \n, oznacza to, że jedna linia jest pusta, bla bla bla. Zakładam, że moja odpowiedź jest prawidłowa.jaka jest różnica między `fseek`,` lseek`, `seekg`,` seekp`?

Potem znalazłem ten problem, którego szukam powinienem użyć do wdrożenia tail? Myślałem, że mogę po prostu użyć seekg (C++ rzecz?), Ale powiedziano mi, że powinienem użyć lseek (wywołanie systemowe Linux?).

Więc w tym fseek (rzeczy ANSI C?), Który powinienem użyć do wdrożenia tail? Czy jest jakaś duża różnica między nimi?

+3

Całkiem pewne 'fseek' jest po prostu opakowaniem dla' lseek' na Linuksie. –

+0

@JamesMcLaughlin, Spodziewam się tego. – Alcott

Odpowiedz

14

Użyj seekg podczas korzystania z biblioteki C++ IOstreams. seekp nie ma tu zastosowania, ponieważ ustawia wskaźnik put.

Podczas korzystania z biblioteki C stdio użyj fseek. Użyj lseek podczas korzystania z niskopoziomowego I/O deskryptora plików POSIX.

Różnica między różnymi funkcjami wyszukiwania jest po prostu rodzajem obiektów plików/strumieni, na których działają. W systemach Linux, seekg i fseek są prawdopodobnie zaimplementowane pod względem lseek.

+0

Tak, mogę z powodzeniem zaimplementować "ogon" używając 'fseek' w' C' lub 'seekg' w' C++ ', prawda? – Alcott

+0

@Alcott: Tak. 'seekg'/IOstreams jest rodzimą biblioteką we/wy C++, ale stdio może być szybsze. Twój wybór. –

+0

Używam linuxa, więc czy powinienem wybrać 'lseek' zamiast' fseek'? – Alcott

Powiązane problemy