blob: 65dd7da5668f149c0c4fa5f83f648933504452c2 [file] [log] [blame]
<html lang="en">
<head>
<title>File Positioning - The GNU C Library</title>
<meta http-equiv="Content-Type" content="text/html">
<meta name="description" content="The GNU C Library">
<meta name="generator" content="makeinfo 4.13">
<link title="Top" rel="start" href="index.html#Top">
<link rel="up" href="I_002fO-on-Streams.html#I_002fO-on-Streams" title="I/O on Streams">
<link rel="prev" href="Binary-Streams.html#Binary-Streams" title="Binary Streams">
<link rel="next" href="Portable-Positioning.html#Portable-Positioning" title="Portable Positioning">
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
<!--
This file documents the GNU C library.
This is Edition 0.12, last updated 2007-10-27,
of `The GNU C Library Reference Manual', for version
2.8 (Sourcery G++ Lite 2011.03-41).
Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002,
2003, 2007, 2008, 2010 Free Software Foundation, Inc.
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being ``Free Software Needs Free Documentation''
and ``GNU Lesser General Public License'', the Front-Cover texts being
``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A
copy of the license is included in the section entitled "GNU Free
Documentation License".
(a) The FSF's Back-Cover Text is: ``You have the freedom to
copy and modify this GNU manual. Buying copies from the FSF
supports it in developing GNU and promoting software freedom.''-->
<meta http-equiv="Content-Style-Type" content="text/css">
<style type="text/css"><!--
pre.display { font-family:inherit }
pre.format { font-family:inherit }
pre.smalldisplay { font-family:inherit; font-size:smaller }
pre.smallformat { font-family:inherit; font-size:smaller }
pre.smallexample { font-size:smaller }
pre.smalllisp { font-size:smaller }
span.sc { font-variant:small-caps }
span.roman { font-family:serif; font-weight:normal; }
span.sansserif { font-family:sans-serif; font-weight:normal; }
--></style>
<link rel="stylesheet" type="text/css" href="../cs.css">
</head>
<body>
<div class="node">
<a name="File-Positioning"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Portable-Positioning.html#Portable-Positioning">Portable Positioning</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Binary-Streams.html#Binary-Streams">Binary Streams</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="I_002fO-on-Streams.html#I_002fO-on-Streams">I/O on Streams</a>
<hr>
</div>
<h3 class="section">12.18 File Positioning</h3>
<p><a name="index-file-positioning-on-a-stream-1107"></a><a name="index-positioning-a-stream-1108"></a><a name="index-seeking-on-a-stream-1109"></a>
The <dfn>file position</dfn> of a stream describes where in the file the
stream is currently reading or writing. I/O on the stream advances the
file position through the file. In the GNU system, the file position is
represented as an integer, which counts the number of bytes from the
beginning of the file. See <a href="File-Position.html#File-Position">File Position</a>.
<p>During I/O to an ordinary disk file, you can change the file position
whenever you wish, so as to read or write any portion of the file. Some
other kinds of files may also permit this. Files which support changing
the file position are sometimes referred to as <dfn>random-access</dfn>
files.
<p>You can use the functions in this section to examine or modify the file
position indicator associated with a stream. The symbols listed below
are declared in the header file <samp><span class="file">stdio.h</span></samp>.
<a name="index-stdio_002eh-1110"></a>
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: long int <b>ftell</b> (<var>FILE *stream</var>)<var><a name="index-ftell-1111"></a></var><br>
<blockquote><p>This function returns the current file position of the stream
<var>stream</var>.
<p>This function can fail if the stream doesn't support file positioning,
or if the file position can't be represented in a <code>long int</code>, and
possibly for other reasons as well. If a failure occurs, a value of
<code>-1</code> is returned.
</p></blockquote></div>
<!-- stdio.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Function: off_t <b>ftello</b> (<var>FILE *stream</var>)<var><a name="index-ftello-1112"></a></var><br>
<blockquote><p>The <code>ftello</code> function is similar to <code>ftell</code>, except that it
returns a value of type <code>off_t</code>. Systems which support this type
use it to describe all file positions, unlike the POSIX specification
which uses a long int. The two are not necessarily the same size.
Therefore, using ftell can lead to problems if the implementation is
written on top of a POSIX compliant low-level I/O implementation, and using
<code>ftello</code> is preferable whenever it is available.
<p>If this function fails it returns <code>(off_t) -1</code>. This can happen due
to missing support for file positioning or internal errors. Otherwise
the return value is the current file position.
<p>The function is an extension defined in the Unix Single Specification
version 2.
<p>When the sources are compiled with <code>_FILE_OFFSET_BITS == 64</code> on a
32 bit system this function is in fact <code>ftello64</code>. I.e., the
LFS interface transparently replaces the old interface.
</p></blockquote></div>
<!-- stdio.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Function: off64_t <b>ftello64</b> (<var>FILE *stream</var>)<var><a name="index-ftello64-1113"></a></var><br>
<blockquote><p>This function is similar to <code>ftello</code> with the only difference that
the return value is of type <code>off64_t</code>. This also requires that the
stream <var>stream</var> was opened using either <code>fopen64</code>,
<code>freopen64</code>, or <code>tmpfile64</code> since otherwise the underlying
file operations to position the file pointer beyond the 2^31
bytes limit might fail.
<p>If the sources are compiled with <code>_FILE_OFFSET_BITS == 64</code> on a 32
bits machine this function is available under the name <code>ftello</code>
and so transparently replaces the old interface.
</p></blockquote></div>
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>fseek</b> (<var>FILE *stream, long int offset, int whence</var>)<var><a name="index-fseek-1114"></a></var><br>
<blockquote><p>The <code>fseek</code> function is used to change the file position of the
stream <var>stream</var>. The value of <var>whence</var> must be one of the
constants <code>SEEK_SET</code>, <code>SEEK_CUR</code>, or <code>SEEK_END</code>, to
indicate whether the <var>offset</var> is relative to the beginning of the
file, the current file position, or the end of the file, respectively.
<p>This function returns a value of zero if the operation was successful,
and a nonzero value to indicate failure. A successful call also clears
the end-of-file indicator of <var>stream</var> and discards any characters
that were &ldquo;pushed back&rdquo; by the use of <code>ungetc</code>.
<p><code>fseek</code> either flushes any buffered output before setting the file
position or else remembers it so it will be written later in its proper
place in the file.
</p></blockquote></div>
<!-- stdio.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Function: int <b>fseeko</b> (<var>FILE *stream, off_t offset, int whence</var>)<var><a name="index-fseeko-1115"></a></var><br>
<blockquote><p>This function is similar to <code>fseek</code> but it corrects a problem with
<code>fseek</code> in a system with POSIX types. Using a value of type
<code>long int</code> for the offset is not compatible with POSIX.
<code>fseeko</code> uses the correct type <code>off_t</code> for the <var>offset</var>
parameter.
<p>For this reason it is a good idea to prefer <code>ftello</code> whenever it is
available since its functionality is (if different at all) closer the
underlying definition.
<p>The functionality and return value is the same as for <code>fseek</code>.
<p>The function is an extension defined in the Unix Single Specification
version 2.
<p>When the sources are compiled with <code>_FILE_OFFSET_BITS == 64</code> on a
32 bit system this function is in fact <code>fseeko64</code>. I.e., the
LFS interface transparently replaces the old interface.
</p></blockquote></div>
<!-- stdio.h -->
<!-- Unix98 -->
<div class="defun">
&mdash; Function: int <b>fseeko64</b> (<var>FILE *stream, off64_t offset, int whence</var>)<var><a name="index-fseeko64-1116"></a></var><br>
<blockquote><p>This function is similar to <code>fseeko</code> with the only difference that
the <var>offset</var> parameter is of type <code>off64_t</code>. This also
requires that the stream <var>stream</var> was opened using either
<code>fopen64</code>, <code>freopen64</code>, or <code>tmpfile64</code> since otherwise
the underlying file operations to position the file pointer beyond the
2^31 bytes limit might fail.
<p>If the sources are compiled with <code>_FILE_OFFSET_BITS == 64</code> on a 32
bits machine this function is available under the name <code>fseeko</code>
and so transparently replaces the old interface.
</p></blockquote></div>
<p><strong>Portability Note:</strong> In non-POSIX systems, <code>ftell</code>,
<code>ftello</code>, <code>fseek</code> and <code>fseeko</code> might work reliably only
on binary streams. See <a href="Binary-Streams.html#Binary-Streams">Binary Streams</a>.
<p>The following symbolic constants are defined for use as the <var>whence</var>
argument to <code>fseek</code>. They are also used with the <code>lseek</code>
function (see <a href="I_002fO-Primitives.html#I_002fO-Primitives">I/O Primitives</a>) and to specify offsets for file locks
(see <a href="Control-Operations.html#Control-Operations">Control Operations</a>).
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>SEEK_SET</b><var><a name="index-SEEK_005fSET-1117"></a></var><br>
<blockquote><p>This is an integer constant which, when used as the <var>whence</var>
argument to the <code>fseek</code> or <code>fseeko</code> function, specifies that
the offset provided is relative to the beginning of the file.
</p></blockquote></div>
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>SEEK_CUR</b><var><a name="index-SEEK_005fCUR-1118"></a></var><br>
<blockquote><p>This is an integer constant which, when used as the <var>whence</var>
argument to the <code>fseek</code> or <code>fseeko</code> function, specifies that
the offset provided is relative to the current file position.
</p></blockquote></div>
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Macro: int <b>SEEK_END</b><var><a name="index-SEEK_005fEND-1119"></a></var><br>
<blockquote><p>This is an integer constant which, when used as the <var>whence</var>
argument to the <code>fseek</code> or <code>fseeko</code> function, specifies that
the offset provided is relative to the end of the file.
</p></blockquote></div>
<!-- stdio.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: void <b>rewind</b> (<var>FILE *stream</var>)<var><a name="index-rewind-1120"></a></var><br>
<blockquote><p>The <code>rewind</code> function positions the stream <var>stream</var> at the
beginning of the file. It is equivalent to calling <code>fseek</code> or
<code>fseeko</code> on the <var>stream</var> with an <var>offset</var> argument of
<code>0L</code> and a <var>whence</var> argument of <code>SEEK_SET</code>, except that
the return value is discarded and the error indicator for the stream is
reset.
</p></blockquote></div>
<p>These three aliases for the &lsquo;<samp><span class="samp">SEEK_...</span></samp>&rsquo; constants exist for the
sake of compatibility with older BSD systems. They are defined in two
different header files: <samp><span class="file">fcntl.h</span></samp> and <samp><span class="file">sys/file.h</span></samp>.
<dl>
<!-- sys/file.h -->
<!-- BSD -->
<dt><code>L_SET</code><dd><a name="index-L_005fSET-1121"></a>An alias for <code>SEEK_SET</code>.
<!-- sys/file.h -->
<!-- BSD -->
<br><dt><code>L_INCR</code><dd><a name="index-L_005fINCR-1122"></a>An alias for <code>SEEK_CUR</code>.
<!-- sys/file.h -->
<!-- BSD -->
<br><dt><code>L_XTND</code><dd><a name="index-L_005fXTND-1123"></a>An alias for <code>SEEK_END</code>.
</dl>
</body></html>