---
name: "fscanf"
section: "3"
platform: "linux"
package: "man-pages"
version: "6.19-1"
release: "Arch Linux 2026-11-01"
platforms: ["linux", "freebsd"]
url: "https://new.carta.tech/scanf"
---

# fscanf(3)

input FILE format conversion

Part of [scanf(3)](/scanf/3.md).

## NAME

scanf, fscanf, vscanf, vfscanf - input FILE format conversion

## LIBRARY

Standard C library (*libc*, *-lc*)

## SYNOPSIS

```
#include <stdio.h>
```

**int scanf(const char \*restrict** *format***, ...);** **int fscanf(FILE \*restrict** *stream***,**            **const char \*restrict** *format***, ...);**

**#include \<stdarg.h\>**

**int vscanf(const char \*restrict** *format***, va\_list** *ap***);** **int vfscanf(FILE \*restrict** *stream***,**            **const char \*restrict** *format***, va\_list** *ap***);**

Feature Test Macro Requirements for glibc (see [**feature\_test\_macros**(7)](/feature_test_macros/7.md)):

**vscanf**(), **vfscanf**():

```
    _ISOC99_SOURCE || _POSIX_C_SOURCE >= 200112L
```

## DESCRIPTION

The **scanf**() family of functions scans formatted input like [**sscanf**(3)](/sscanf/3.md), but read from a *FILE*. It is very difficult to use these functions correctly, and it is preferable to read entire lines with [**fgets**(3)](/fgets/3.md) or [**getline**(3)](/getline/3.md) and parse them later with [**sscanf**(3)](/sscanf/3.md) or more specialized functions such as [**strtol**(3)](/strtol/3.md).

The **scanf**() function reads input from the standard input stream *stdin* and **fscanf**() reads input from the stream pointer *stream*.

The **vfscanf**() function is analogous to [**vfprintf**(3)](/vfprintf/3.md) and reads input from the stream pointer *stream* using a variable argument list of pointers (see [**stdarg**(3)](/stdarg/3.md). The **vscanf**() function is analogous to [**vprintf**(3)](/vprintf/3.md) and reads from the standard input.

## RETURN VALUE

On success, these functions return the number of input items successfully matched and assigned; this can be fewer than provided for, or even zero, in the event of an early matching failure.

The value **EOF** is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. **EOF** is also returned if a read error occurs, in which case the error indicator for the stream (see [**ferror**(3)](/ferror/3.md)) is set, and *errno* is set to indicate the error.

## ERRORS

- **EAGAIN**

  The file descriptor underlying *stream* is marked nonblocking, and the read operation would block.

- **EBADF**

  The file descriptor underlying *stream* is invalid, or not open for reading.

- **EILSEQ**

  Input byte sequence does not form a valid character.

- **EINTR**

  The read operation was interrupted by a signal; see [**signal**(7)](/signal/7.md).

- **EINVAL**

  Not enough arguments; or *format* is NULL.

- **ENOMEM**

  Out of memory.

## ATTRIBUTES

For an explanation of the terms used in this section, see [**attributes**(7)](/attributes/7.md).

| | | |
| --- | --- | --- |
| **Interface** | **Attribute** | **Value** |
| **scanf**(), **fscanf**(), **vscanf**(), **vfscanf**() | Thread safety | MT-Safe locale |

## STANDARDS

C11, POSIX.1-2008.

## HISTORY

C99, POSIX.1-2001.

## CAVEATS

These functions make it difficult to distinguish newlines from other white space. This is especially problematic with line-buffered input, like the standard input stream.

These functions can't report errors after the last non-suppressed conversion specification.

## BUGS

It is impossible to accurately know how many characters these functions have consumed from the input stream, since they only report the number of successful conversions. For example, if the input is "123\\n a", *scanf("%d %d", &a, &b)* will consume the digits, the newline, and the space, but not the letter a. This makes it difficult to recover from invalid input.

## SEE ALSO

[**fgets**(3)](/fgets/3.md), [**getline**(3)](/getline/3.md), [**sscanf**(3)](/sscanf/3.md)
