<stdio.h>头文件详细解析

stdio(Standard Input Output)库是C语言标准库中的一个重要组成部分,用于提供标准的输入和输出功能。该库包含了一系列函数,用于从标准输入设备(例如键盘)读取数据,向标准输出设备(例如显示器)写入数据,以及进行文件操作。

下面是详细的<stdio.h>

/* Define ISO C stdio on top of C++ iostreams.
   Copyright (C) 1991-2016 Free Software Foundation, Inc.
   This file is part of the GNU C Library.

   The GNU C Library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 2.1 of the License, or (at your option) any later version.

   The GNU C Library is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with the GNU C Library; if not, see
   <http://www.gnu.org/licenses/>.  */

/*
 *	ISO C99 Standard: 7.19 Input/output	<stdio.h>
 */

#ifndef _STDIO_H

#if !defined __need_FILE && !defined __need___FILE
# define _STDIO_H	1
# include <features.h>

__BEGIN_DECLS

# define __need_size_t
# define __need_NULL
# include <stddef.h>

# include <bits/types.h>
# define __need_FILE
# define __need___FILE
#endif /* Don't need FILE.  */


#if !defined __FILE_defined && defined __need_FILE

/* Define outside of namespace so the C++ is happy.  */
struct _IO_FILE;

__BEGIN_NAMESPACE_STD
/* The opaque type of streams.  This is the definition used elsewhere.  */
typedef struct _IO_FILE FILE;
__END_NAMESPACE_STD
#if defined __USE_LARGEFILE64 || defined __USE_POSIX \
    || defined __USE_ISOC99 || defined __USE_XOPEN \
    || defined __USE_POSIX2
__USING_NAMESPACE_STD(FILE)
#endif

# define __FILE_defined	1
#endif /* FILE not defined.  */
#undef	__need_FILE


#if !defined ____FILE_defined && defined __need___FILE

/* The opaque type of streams.  This is the definition used elsewhere.  */
typedef struct _IO_FILE __FILE;

# define ____FILE_defined	1
#endif /* __FILE not defined.  */
#undef	__need___FILE


#ifdef	_STDIO_H
#define _STDIO_USES_IOSTREAM

#include <libio.h>

#if defined __USE_XOPEN || defined __USE_XOPEN2K8
# ifdef __GNUC__
#  ifndef _VA_LIST_DEFINED
typedef _G_va_list va_list;
#   define _VA_LIST_DEFINED
#  endif
# else
#  include <stdarg.h>
# endif
#endif

#ifdef __USE_XOPEN2K8
# ifndef __off_t_defined
# ifndef __USE_FILE_OFFSET64
typedef __off_t off_t;
# else
typedef __off64_t off_t;
# endif
# define __off_t_defined
# endif
# if defined __USE_LARGEFILE64 && !defined __off64_t_defined
typedef __off64_t off64_t;
# define __off64_t_defined
# endif

# ifndef __ssize_t_defined
typedef __ssize_t ssize_t;
# define __ssize_t_defined
# endif
#endif

/* The type of the second argument to `fgetpos' and `fsetpos'.  */
__BEGIN_NAMESPACE_STD
#ifndef __USE_FILE_OFFSET64
typedef _G_fpos_t fpos_t;
#else
typedef _G_fpos64_t fpos_t;
#endif
__END_NAMESPACE_STD
#ifdef __USE_LARGEFILE64
typedef _G_fpos64_t fpos64_t;
#endif

/* The possibilities for the third argument to `setvbuf'.  */
#define _IOFBF 0		/* Fully buffered.  */
#define _IOLBF 1		/* Line buffered.  */
#define _IONBF 2		/* No buffering.  */


/* Default buffer size.  */
#ifndef BUFSIZ
# define BUFSIZ _IO_BUFSIZ
#endif


/* End of file character.
   Some things throughout the library rely on this being -1.  */
#ifndef EOF
# define EOF (-1)
#endif


/* The possibilities for the third argument to `fseek'.
   These values should not be changed.  */
#define SEEK_SET	0	/* Seek from beginning of file.  */
#define SEEK_CUR	1	/* Seek from current position.  */
#define SEEK_END	2	/* Seek from end of file.  */
#ifdef __USE_GNU
# define SEEK_DATA	3	/* Seek to next data.  */
# define SEEK_HOLE	4	/* Seek to next hole.  */
#endif


#if defined __USE_MISC || defined __USE_XOPEN
/* Default path prefix for `tempnam' and `tmpnam'.  */
# define P_tmpdir	"/tmp"
#endif


/* Get the values:
   L_tmpnam	How long an array of chars must be to be passed to `tmpnam'.
   TMP_MAX	The minimum number of unique filenames generated by tmpnam
		(and tempnam when it uses tmpnam's name space),
		or tempnam (the two are separate).
   L_ctermid	How long an array to pass to `ctermid'.
   L_cuserid	How long an array to pass to `cuserid'.
   FOPEN_MAX	Minimum number of files that can be open at once.
   FILENAME_MAX	Maximum length of a filename.  */
#include <bits/stdio_lim.h>


/* Standard streams.  */
extern struct _IO_FILE *stdin;		/* Standard input stream.  */
extern struct _IO_FILE *stdout;		/* Standard output stream.  */
extern struct _IO_FILE *stderr;		/* Standard error output stream.  */
/* C89/C99 say they're macros.  Make them happy.  */
#define stdin stdin
#define stdout stdout
#define stderr stderr

__BEGIN_NAMESPACE_STD
/* Remove file FILENAME.  */
extern int remove (const char *__filename) __THROW;
/* Rename file OLD to NEW.  */
extern int rename (const char *__old, const char *__new) __THROW;
__END_NAMESPACE_STD

#ifdef __USE_ATFILE
/* Rename file OLD relative to OLDFD to NEW relative to NEWFD.  */
extern int renameat (int __oldfd, const char *__old, int __newfd,
		     const char *__new) __THROW;
#endif

__BEGIN_NAMESPACE_STD
/* Create a temporary file and open it read/write.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
#ifndef __USE_FILE_OFFSET64
extern FILE *tmpfile (void) __wur;
#else
# ifdef __REDIRECT
extern FILE *__REDIRECT (tmpfile, (void), tmpfile64) __wur;
# else
#  define tmpfile tmpfile64
# endif
#endif

#ifdef __USE_LARGEFILE64
extern FILE *tmpfile64 (void) __wur;
#endif

/* Generate a temporary filename.  */
extern char *tmpnam (char *__s) __THROW __wur;
__END_NAMESPACE_STD

#ifdef __USE_MISC
/* This is the reentrant variant of `tmpnam'.  The only difference is
   that it does not allow S to be NULL.  */
extern char *tmpnam_r (char *__s) __THROW __wur;
#endif


#if defined __USE_MISC || defined __USE_XOPEN
/* Generate a unique temporary filename using up to five characters of PFX
   if it is not NULL.  The directory to put this file in is searched for
   as follows: First the environment variable "TMPDIR" is checked.
   If it contains the name of a writable directory, that directory is used.
   If not and if DIR is not NULL, that value is checked.  If that fails,
   P_tmpdir is tried and finally "/tmp".  The storage for the filename
   is allocated by `malloc'.  */
extern char *tempnam (const char *__dir, const char *__pfx)
     __THROW __attribute_malloc__ __wur;
#endif


__BEGIN_NAMESPACE_STD
/* Close STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fclose (FILE *__stream);
/* Flush STREAM, or all streams if STREAM is NULL.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fflush (FILE *__stream);
__END_NAMESPACE_STD

#ifdef __USE_MISC
/* Faster versions when locking is not required.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern int fflush_unlocked (FILE *__stream);
#endif

#ifdef __USE_GNU
/* Close all streams.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern int fcloseall (void);
#endif


__BEGIN_NAMESPACE_STD
#ifndef __USE_FILE_OFFSET64
/* Open a file and create a new stream for it.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern FILE *fopen (const char *__restrict __filename,
		    const char *__restrict __modes) __wur;
/* Open a file, replacing an existing stream with it.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern FILE *freopen (const char *__restrict __filename,
		      const char *__restrict __modes,
		      FILE *__restrict __stream) __wur;
#else
# ifdef __REDIRECT
extern FILE *__REDIRECT (fopen, (const char *__restrict __filename,
				 const char *__restrict __modes), fopen64)
  __wur;
extern FILE *__REDIRECT (freopen, (const char *__restrict __filename,
				   const char *__restrict __modes,
				   FILE *__restrict __stream), freopen64)
  __wur;
# else
#  define fopen fopen64
#  define freopen freopen64
# endif
#endif
__END_NAMESPACE_STD
#ifdef __USE_LARGEFILE64
extern FILE *fopen64 (const char *__restrict __filename,
		      const char *__restrict __modes) __wur;
extern FILE *freopen64 (const char *__restrict __filename,
			const char *__restrict __modes,
			FILE *__restrict __stream) __wur;
#endif

#ifdef	__USE_POSIX
/* Create a new stream that refers to an existing system file descriptor.  */
extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur;
#endif

#ifdef	__USE_GNU
/* Create a new stream that refers to the given magic cookie,
   and uses the given functions for input and output.  */
extern FILE *fopencookie (void *__restrict __magic_cookie,
			  const char *__restrict __modes,
			  _IO_cookie_io_functions_t __io_funcs) __THROW __wur;
#endif

#ifdef __USE_XOPEN2K8
/* Create a new stream that refers to a memory buffer.  */
extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
  __THROW __wur;

/* Open a stream that writes into a malloc'd buffer that is expanded as
   necessary.  *BUFLOC and *SIZELOC are updated with the buffer's location
   and the number of characters written on fflush or fclose.  */
extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW __wur;
#endif


__BEGIN_NAMESPACE_STD
/* If BUF is NULL, make STREAM unbuffered.
   Else make it use buffer BUF, of size BUFSIZ.  */
extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __THROW;
/* Make STREAM use buffering mode MODE.
   If BUF is not NULL, use N bytes of it for buffering;
   else allocate an internal buffer N bytes long.  */
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
		    int __modes, size_t __n) __THROW;
__END_NAMESPACE_STD

#ifdef	__USE_MISC
/* If BUF is NULL, make STREAM unbuffered.
   Else make it use SIZE bytes of BUF for buffering.  */
extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
		       size_t __size) __THROW;

/* Make STREAM line-buffered.  */
extern void setlinebuf (FILE *__stream) __THROW;
#endif


__BEGIN_NAMESPACE_STD
/* Write formatted output to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fprintf (FILE *__restrict __stream,
		    const char *__restrict __format, ...);
/* Write formatted output to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int printf (const char *__restrict __format, ...);
/* Write formatted output to S.  */
extern int sprintf (char *__restrict __s,
		    const char *__restrict __format, ...) __THROWNL;

/* Write formatted output to S from argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
		     _G_va_list __arg);
/* Write formatted output to stdout from argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int vprintf (const char *__restrict __format, _G_va_list __arg);
/* Write formatted output to S from argument list ARG.  */
extern int vsprintf (char *__restrict __s, const char *__restrict __format,
		     _G_va_list __arg) __THROWNL;
__END_NAMESPACE_STD

#if defined __USE_ISOC99 || defined __USE_UNIX98
__BEGIN_NAMESPACE_C99
/* Maximum chars of output to write in MAXLEN.  */
extern int snprintf (char *__restrict __s, size_t __maxlen,
		     const char *__restrict __format, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 3, 4)));

extern int vsnprintf (char *__restrict __s, size_t __maxlen,
		      const char *__restrict __format, _G_va_list __arg)
     __THROWNL __attribute__ ((__format__ (__printf__, 3, 0)));
__END_NAMESPACE_C99
#endif

#ifdef __USE_GNU
/* Write formatted output to a string dynamically allocated with `malloc'.
   Store the address of the string in *PTR.  */
extern int vasprintf (char **__restrict __ptr, const char *__restrict __f,
		      _G_va_list __arg)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
extern int __asprintf (char **__restrict __ptr,
		       const char *__restrict __fmt, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
extern int asprintf (char **__restrict __ptr,
		     const char *__restrict __fmt, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
#endif

#ifdef __USE_XOPEN2K8
/* Write formatted output to a file descriptor.  */
extern int vdprintf (int __fd, const char *__restrict __fmt,
		     _G_va_list __arg)
     __attribute__ ((__format__ (__printf__, 2, 0)));
extern int dprintf (int __fd, const char *__restrict __fmt, ...)
     __attribute__ ((__format__ (__printf__, 2, 3)));
#endif


__BEGIN_NAMESPACE_STD
/* Read formatted input from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fscanf (FILE *__restrict __stream,
		   const char *__restrict __format, ...) __wur;
/* Read formatted input from stdin.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int scanf (const char *__restrict __format, ...) __wur;
/* Read formatted input from S.  */
extern int sscanf (const char *__restrict __s,
		   const char *__restrict __format, ...) __THROW;

#if defined __USE_ISOC99 && !defined __USE_GNU \
    && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
    && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
# ifdef __REDIRECT
/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[
   GNU extension which conflicts with valid %a followed by letter
   s, S or [.  */
extern int __REDIRECT (fscanf, (FILE *__restrict __stream,
				const char *__restrict __format, ...),
		       __isoc99_fscanf) __wur;
extern int __REDIRECT (scanf, (const char *__restrict __format, ...),
		       __isoc99_scanf) __wur;
extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
				    const char *__restrict __format, ...),
			   __isoc99_sscanf);
# else
extern int __isoc99_fscanf (FILE *__restrict __stream,
			    const char *__restrict __format, ...) __wur;
extern int __isoc99_scanf (const char *__restrict __format, ...) __wur;
extern int __isoc99_sscanf (const char *__restrict __s,
			    const char *__restrict __format, ...) __THROW;
#  define fscanf __isoc99_fscanf
#  define scanf __isoc99_scanf
#  define sscanf __isoc99_sscanf
# endif
#endif

__END_NAMESPACE_STD

#ifdef	__USE_ISOC99
__BEGIN_NAMESPACE_C99
/* Read formatted input from S into argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
		    _G_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;

/* Read formatted input from stdin into argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int vscanf (const char *__restrict __format, _G_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;

/* Read formatted input from S into argument list ARG.  */
extern int vsscanf (const char *__restrict __s,
		    const char *__restrict __format, _G_va_list __arg)
     __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));

# if !defined __USE_GNU \
     && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
     && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
#  ifdef __REDIRECT
/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[
   GNU extension which conflicts with valid %a followed by letter
   s, S or [.  */
extern int __REDIRECT (vfscanf,
		       (FILE *__restrict __s,
			const char *__restrict __format, _G_va_list __arg),
		       __isoc99_vfscanf)
     __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
extern int __REDIRECT (vscanf, (const char *__restrict __format,
				_G_va_list __arg), __isoc99_vscanf)
     __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
extern int __REDIRECT_NTH (vsscanf,
			   (const char *__restrict __s,
			    const char *__restrict __format,
			    _G_va_list __arg), __isoc99_vsscanf)
     __attribute__ ((__format__ (__scanf__, 2, 0)));
#  else
extern int __isoc99_vfscanf (FILE *__restrict __s,
			     const char *__restrict __format,
			     _G_va_list __arg) __wur;
extern int __isoc99_vscanf (const char *__restrict __format,
			    _G_va_list __arg) __wur;
extern int __isoc99_vsscanf (const char *__restrict __s,
			     const char *__restrict __format,
			     _G_va_list __arg) __THROW;
#   define vfscanf __isoc99_vfscanf
#   define vscanf __isoc99_vscanf
#   define vsscanf __isoc99_vsscanf
#  endif
# endif

__END_NAMESPACE_C99
#endif /* Use ISO C9x.  */


__BEGIN_NAMESPACE_STD
/* Read a character from STREAM.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
extern int fgetc (FILE *__stream);
extern int getc (FILE *__stream);

/* Read a character from stdin.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int getchar (void);
__END_NAMESPACE_STD

/* The C standard explicitly says this is a macro, so we always do the
   optimization for it.  */
#define getc(_fp) _IO_getc (_fp)

#ifdef __USE_POSIX
/* These are defined in POSIX.1:1996.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
extern int getc_unlocked (FILE *__stream);
extern int getchar_unlocked (void);
#endif /* Use POSIX.  */

#ifdef __USE_MISC
/* Faster version when locking is not necessary.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern int fgetc_unlocked (FILE *__stream);
#endif /* Use MISC.  */


__BEGIN_NAMESPACE_STD
/* Write a character to STREAM.

   These functions are possible cancellation points and therefore not
   marked with __THROW.

   These functions is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fputc (int __c, FILE *__stream);
extern int putc (int __c, FILE *__stream);

/* Write a character to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int putchar (int __c);
__END_NAMESPACE_STD

/* The C standard explicitly says this can be a macro,
   so we always do the optimization for it.  */
#define putc(_ch, _fp) _IO_putc (_ch, _fp)

#ifdef __USE_MISC
/* Faster version when locking is not necessary.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern int fputc_unlocked (int __c, FILE *__stream);
#endif /* Use MISC.  */

#ifdef __USE_POSIX
/* These are defined in POSIX.1:1996.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
extern int putc_unlocked (int __c, FILE *__stream);
extern int putchar_unlocked (int __c);
#endif /* Use POSIX.  */


#if defined __USE_MISC \
    || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
/* Get a word (int) from STREAM.  */
extern int getw (FILE *__stream);

/* Write a word (int) to STREAM.  */
extern int putw (int __w, FILE *__stream);
#endif


__BEGIN_NAMESPACE_STD
/* Get a newline-terminated string of finite length from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
     __wur;

#if !defined __USE_ISOC11 \
    || (defined __cplusplus && __cplusplus <= 201103L)
/* Get a newline-terminated string from stdin, removing the newline.
   DO NOT USE THIS FUNCTION!!  There is no limit on how much it will read.

   The function has been officially removed in ISO C11.  This opportunity
   is used to also remove it from the GNU feature list.  It is now only
   available when explicitly using an old ISO C, Unix, or POSIX standard.
   GCC defines _GNU_SOURCE when building C++ code and the function is still
   in C++11, so it is also available for C++.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern char *gets (char *__s) __wur __attribute_deprecated__;
#endif
__END_NAMESPACE_STD

#ifdef __USE_GNU
/* This function does the same as `fgets' but does not lock the stream.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern char *fgets_unlocked (char *__restrict __s, int __n,
			     FILE *__restrict __stream) __wur;
#endif


#ifdef	__USE_XOPEN2K8
/* Read up to (and including) a DELIMITER from STREAM into *LINEPTR
   (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
   NULL), pointing to *N characters of space.  It is realloc'd as
   necessary.  Returns the number of characters read (not including the
   null terminator), or -1 on error or EOF.

   These functions are not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation they are cancellation points and
   therefore not marked with __THROW.  */
extern _IO_ssize_t __getdelim (char **__restrict __lineptr,
			       size_t *__restrict __n, int __delimiter,
			       FILE *__restrict __stream) __wur;
extern _IO_ssize_t getdelim (char **__restrict __lineptr,
			     size_t *__restrict __n, int __delimiter,
			     FILE *__restrict __stream) __wur;

/* Like `getdelim', but reads up to a newline.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern _IO_ssize_t getline (char **__restrict __lineptr,
			    size_t *__restrict __n,
			    FILE *__restrict __stream) __wur;
#endif


__BEGIN_NAMESPACE_STD
/* Write a string to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fputs (const char *__restrict __s, FILE *__restrict __stream);

/* Write a string, followed by a newline, to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int puts (const char *__s);


/* Push a character back onto the input buffer of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int ungetc (int __c, FILE *__stream);


/* Read chunks of generic data from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern size_t fread (void *__restrict __ptr, size_t __size,
		     size_t __n, FILE *__restrict __stream) __wur;
/* Write chunks of generic data to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern size_t fwrite (const void *__restrict __ptr, size_t __size,
		      size_t __n, FILE *__restrict __s);
__END_NAMESPACE_STD

#ifdef __USE_GNU
/* This function does the same as `fputs' but does not lock the stream.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
extern int fputs_unlocked (const char *__restrict __s,
			   FILE *__restrict __stream);
#endif

#ifdef __USE_MISC
/* Faster versions when locking is not necessary.

   These functions are not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation they are cancellation points and
   therefore not marked with __THROW.  */
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
			      size_t __n, FILE *__restrict __stream) __wur;
extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
			       size_t __n, FILE *__restrict __stream);
#endif


__BEGIN_NAMESPACE_STD
/* Seek to a certain position on STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fseek (FILE *__stream, long int __off, int __whence);
/* Return the current position of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern long int ftell (FILE *__stream) __wur;
/* Rewind to the beginning of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void rewind (FILE *__stream);
__END_NAMESPACE_STD

/* The Single Unix Specification, Version 2, specifies an alternative,
   more adequate interface for the two functions above which deal with
   file offset.  `long int' is not the right type.  These definitions
   are originally defined in the Large File Support API.  */

#if defined __USE_LARGEFILE || defined __USE_XOPEN2K
# ifndef __USE_FILE_OFFSET64
/* Seek to a certain position on STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fseeko (FILE *__stream, __off_t __off, int __whence);
/* Return the current position of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern __off_t ftello (FILE *__stream) __wur;
# else
#  ifdef __REDIRECT
extern int __REDIRECT (fseeko,
		       (FILE *__stream, __off64_t __off, int __whence),
		       fseeko64);
extern __off64_t __REDIRECT (ftello, (FILE *__stream), ftello64);
#  else
#   define fseeko fseeko64
#   define ftello ftello64
#  endif
# endif
#endif

__BEGIN_NAMESPACE_STD
#ifndef __USE_FILE_OFFSET64
/* Get STREAM's position.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
/* Set STREAM's position.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int fsetpos (FILE *__stream, const fpos_t *__pos);
#else
# ifdef __REDIRECT
extern int __REDIRECT (fgetpos, (FILE *__restrict __stream,
				 fpos_t *__restrict __pos), fgetpos64);
extern int __REDIRECT (fsetpos,
		       (FILE *__stream, const fpos_t *__pos), fsetpos64);
# else
#  define fgetpos fgetpos64
#  define fsetpos fsetpos64
# endif
#endif
__END_NAMESPACE_STD

#ifdef __USE_LARGEFILE64
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);
extern __off64_t ftello64 (FILE *__stream) __wur;
extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos);
extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos);
#endif

__BEGIN_NAMESPACE_STD
/* Clear the error and EOF indicators for STREAM.  */
extern void clearerr (FILE *__stream) __THROW;
/* Return the EOF indicator for STREAM.  */
extern int feof (FILE *__stream) __THROW __wur;
/* Return the error indicator for STREAM.  */
extern int ferror (FILE *__stream) __THROW __wur;
__END_NAMESPACE_STD

#ifdef __USE_MISC
/* Faster versions when locking is not required.  */
extern void clearerr_unlocked (FILE *__stream) __THROW;
extern int feof_unlocked (FILE *__stream) __THROW __wur;
extern int ferror_unlocked (FILE *__stream) __THROW __wur;
#endif


__BEGIN_NAMESPACE_STD
/* Print a message describing the meaning of the value of errno.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern void perror (const char *__s);
__END_NAMESPACE_STD

/* Provide the declarations for `sys_errlist' and `sys_nerr' if they
   are available on this system.  Even if available, these variables
   should not be used directly.  The `strerror' function provides
   all the necessary functionality.  */
#include <bits/sys_errlist.h>


#ifdef	__USE_POSIX
/* Return the system file descriptor for STREAM.  */
extern int fileno (FILE *__stream) __THROW __wur;
#endif /* Use POSIX.  */

#ifdef __USE_MISC
/* Faster version when locking is not required.  */
extern int fileno_unlocked (FILE *__stream) __THROW __wur;
#endif


#ifdef __USE_POSIX2
/* Create a new stream connected to a pipe running the given command.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern FILE *popen (const char *__command, const char *__modes) __wur;

/* Close a stream opened by popen and return the status of its child.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
extern int pclose (FILE *__stream);
#endif


#ifdef	__USE_POSIX
/* Return the name of the controlling terminal.  */
extern char *ctermid (char *__s) __THROW;
#endif /* Use POSIX.  */


#ifdef __USE_XOPEN
/* Return the name of the current user.  */
extern char *cuserid (char *__s);
#endif /* Use X/Open, but not issue 6.  */


#ifdef	__USE_GNU
struct obstack;			/* See <obstack.h>.  */

/* Write formatted output to an obstack.  */
extern int obstack_printf (struct obstack *__restrict __obstack,
			   const char *__restrict __format, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3)));
extern int obstack_vprintf (struct obstack *__restrict __obstack,
			    const char *__restrict __format,
			    _G_va_list __args)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 0)));
#endif /* Use GNU.  */


#ifdef __USE_POSIX
/* These are defined in POSIX.1:1996.  */

/* Acquire ownership of STREAM.  */
extern void flockfile (FILE *__stream) __THROW;

/* Try to acquire ownership of STREAM but do not block if it is not
   possible.  */
extern int ftrylockfile (FILE *__stream) __THROW __wur;

/* Relinquish the ownership granted for STREAM.  */
extern void funlockfile (FILE *__stream) __THROW;
#endif /* POSIX */

#if defined __USE_XOPEN && !defined __USE_XOPEN2K && !defined __USE_GNU
/* The X/Open standard requires some functions and variables to be
   declared here which do not belong into this header.  But we have to
   follow.  In GNU mode we don't do this nonsense.  */
# define __need_getopt
# include <getopt.h>
#endif	/* X/Open, but not issue 6 and not for GNU.  */

/* If we are compiling with optimizing read this file.  It contains
   several optimizing inline functions and macros.  */
#ifdef __USE_EXTERN_INLINES
# include <bits/stdio.h>
#endif
#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
# include <bits/stdio2.h>
#endif
#ifdef __LDBL_COMPAT
# include <bits/stdio-ldbl.h>
#endif

__END_DECLS

#endif /* <stdio.h> included.  */

#endif /* !_STDIO_H */

 下面是详细的中文和注释

/* 在 C++ 的 iostreams 上定义 ISO C stdio。
   版权所有 (C) 1991-2016 自由软件基金会。
   本文件是 GNU C 库的一部分。

   GNU C 库是自由软件;您可以根据 GNU Lesser General Public
   License(GNU 通用公共许可证)的条款重新发布和/或
   修改它;本许可证的版本为 2.1,或(您选择的)任何更高版本。

   GNU C 库被提供,希望它会有用,
   但是没有任何担保;甚至没有暗示的担保
   适销性或适用于特定用途。详细信息请参阅
   GNU Lesser General Public License。

   您应该收到 GNU Lesser General Public License 的一份副本;
   如果没有,请参阅 <http://www.gnu.org/licenses/>。 */

/*
 * ISO C99 标准:7.19 输入/输出 <stdio.h>
 */
#ifndef _STDIO_H
// 如果尚未定义 _STDIO_H,则执行以下内容,避免重复定义

#if !defined __need_FILE && !defined __need___FILE
// 如果不需要 FILE 结构体和 __FILE 结构体,则执行以下内容

# define _STDIO_H	1
// 定义 _STDIO_H 为 1,表示已经定义了 stdio.h

# include <features.h>
// 包含 features.h 头文件,该头文件包含一些特性的宏定义

__BEGIN_DECLS
// 进入 C 语言声明区域

# define __need_size_t
// 需要 size_t 类型的定义
# define __need_NULL
// 需要 NULL 宏的定义
# include <stddef.h>
// 包含 stddef.h 头文件,定义了 size_t 和 NULL

# include <bits/types.h>
// 包含 bits/types.h 头文件,其中定义了一些基本类型的宏

# define __need_FILE
// 需要 FILE 结构体的定义
# define __need___FILE
// 需要 __FILE 结构体的定义
#endif /* Don't need FILE.  */

#if !defined __FILE_defined && defined __need_FILE
// 如果 FILE 结构体未定义且需要 FILE 结构体定义,则执行以下内容

/* Define outside of namespace so the C++ is happy.  */
// 将 FILE 结构体定义在命名空间之外,以便于 C++ 编译器处理

struct _IO_FILE;
// 声明一个名为 _IO_FILE 的结构体,用于表示文件流的不透明类型

__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间

/* The opaque type of streams.  This is the definition used elsewhere.  */
// 流的不透明类型,这是在其他地方使用的定义
typedef struct _IO_FILE FILE;
// 使用 _IO_FILE 结构体定义 FILE 类型
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间

#if defined __USE_LARGEFILE64 || defined __USE_POSIX \
    || defined __USE_ISOC99 || defined __USE_XOPEN \
    || defined __USE_POSIX2
// 如果使用了大文件支持、POSIX 扩展、ISO C99、X/Open 或者 POSIX2,则执行以下内容
__USING_NAMESPACE_STD(FILE)
// 使用 FILE 类型的命名空间
#endif

# define __FILE_defined	1
// 定义 __FILE_defined 为 1,表示 FILE 结构体已经定义
#endif /* FILE not defined.  */
#undef	__need_FILE
// 取消对 FILE 结构体的需要

#if !defined ____FILE_defined && defined __need___FILE
// 如果 __FILE 结构体未定义且需要 __FILE 结构体定义,则执行以下内容

/* The opaque type of streams.  This is the definition used elsewhere.  */
// 流的不透明类型,这是在其他地方使用的定义
typedef struct _IO_FILE __FILE;
// 使用 _IO_FILE 结构体定义 __FILE 类型

# define ____FILE_defined	1
// 定义 ____FILE_defined 为 1,表示 __FILE 结构体已经定义
#endif /* __FILE not defined.  */
#undef	__need___FILE
// 取消对 __FILE 结构体的需要

#ifdef	_STDIO_H
// 如果已经包含了 stdio.h 头文件,则执行以下内容

#define _STDIO_USES_IOSTREAM
// 定义 _STDIO_USES_IOSTREAM,表示在此处使用了 iostreams

#include <libio.h>
// 包含 libio.h 头文件,该文件定义了与 IO 相关的宏和函数

#if defined __USE_XOPEN || defined __USE_XOPEN2K8
// 如果使用了 X/Open 或者 X/Open 2008 扩展,则执行以下内容
# ifdef __GNUC__
// 如果使用的编译器是 GCC,则执行以下内容
#  ifndef _VA_LIST_DEFINED
// 如果未定义 _VA_LIST_DEFINED 宏,则执行以下内容
typedef _G_va_list va_list;
// 定义 va_list 类型为 _G_va_list 类型
#   define _VA_LIST_DEFINED
// 标记 _VA_LIST_DEFINED 宏已经定义
#  endif
# else
// 如果不是 GCC 编译器,则执行以下内容
#  include <stdarg.h>
// 包含 stdarg.h 头文件,定义了与变参函数相关的宏和函数
# endif
#endif

#ifdef __USE_XOPEN2K8
// 如果使用了 X/Open 2008 扩展,则执行以下内容
# ifndef __off_t_defined
// 如果未定义 __off_t_defined 宏,则执行以下内容
# ifndef __USE_FILE_OFFSET64
// 如果未定义 __USE_FILE_OFFSET64 宏,则执行以下内容
typedef __off_t off_t;
// 定义 off_t 类型为 __off_t 类型
# else
// 如果定义了 __USE_FILE_OFFSET64 宏,则执行以下内容
typedef __off64_t off_t;
// 定义 off_t 类型为 __off64_t 类型
# endif
# define __off_t_defined
// 标记 __off_t_defined 宏已经定义
# endif
// 以下是对于大文件支持的处理
# if defined __USE_LARGEFILE64 && !defined __off64_t_defined
// 如果使用了大文件支持且未定义 __off64_t_defined 宏,则执行以下内容
typedef __off64_t off64_t;
// 定义 off64_t 类型为 __off64_t 类型
# define __off64_t_defined
// 标记 __off64_t_defined 宏已经定义
# endif

# ifndef __ssize_t_defined
// 如果未定义 __ssize_t_defined 宏,则执行以下内容
typedef __ssize_t ssize_t;
// 定义 ssize_t 类型为 __ssize_t 类型
# define __ssize_t_defined
// 标记 __ssize_t_defined 宏已经定义
# endif
#endif

/* The type of the second argument to `fgetpos' and `fsetpos'.  */
// `fgetpos` 和 `fsetpos` 函数的第二个参数类型
__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
#ifndef __USE_FILE_OFFSET64
// 如果未使用大文件支持,则执行以下内容
typedef _G_fpos_t fpos_t;
// 定义 fpos_t 类型为 _G_fpos_t 类型
#else
// 如果使用了大文件支持,则执行以下内容
typedef _G_fpos64_t fpos_t;
// 定义 fpos_t 类型为 _G_fpos64_t 类型
#endif
// 以下是对于大文件支持的处理
#ifdef __USE_LARGEFILE64
// 如果使用了大文件支持,则执行以下内容
typedef _G_fpos64_t fpos64_t;
// 定义 fpos64_t 类型为 _G_fpos64_t 类型
#endif

/* The possibilities for the third argument to `setvbuf'.  */
// `setvbuf` 函数的第三个参数可能的取值
#define _IOFBF 0		/* Fully buffered.  */
// 完全缓冲
#define _IOLBF 1		/* Line buffered.  */
// 行缓冲
#define _IONBF 2		/* No buffering.  */
// 无缓冲

/* Default buffer size.  */
// 默认缓冲区大小
#ifndef BUFSIZ
// 如果未定义 BUFSIZ 宏,则执行以下内容
# define BUFSIZ _IO_BUFSIZ
// 将 BUFSIZ 宏定义为 _IO_BUFSIZ 宏的值
#endif


/* End of file character.
   Some things throughout the library rely on this being -1.  */
// 文件结束字符
#ifndef EOF
// 如果未定义 EOF 宏,则执行以下内容
# define EOF (-1)
// 定义 EOF 宏为 -1
#endif


/* The possibilities for the third argument to `fseek'.
   These values should not be changed.  */
// `fseek` 函数的第三个参数可能的取值
#define SEEK_SET	0	/* Seek from beginning of file.  */
// 从文件开头开始查找
#define SEEK_CUR	1	/* Seek from current position.  */
// 从当前位置开始查找
#define SEEK_END	2	/* Seek from end of file.  */
// 从文件末尾开始查找
#ifdef __USE_GNU
// 如果使用了 GNU 扩展,则执行以下内容
# define SEEK_DATA	3	/* Seek to next data.  */
// 查找到下一个数据
# define SEEK_HOLE	4	/* Seek to next hole.  */
// 查找到下一个空洞
#endif


#if defined __USE_MISC || defined __USE_XOPEN
// 如果使用了 MISC 扩展或者 X/Open 扩展,则执行以下内容
/* Default path prefix for `tempnam' and `tmpnam'.  */
// `tempnam` 和 `tmpnam` 函数的默认路径前缀
# define P_tmpdir	"/tmp"
// 默认路径前缀为 "/tmp"
#endif


/* Get the values:
   L_tmpnam	How long an array of chars must be to be passed to `tmpnam'.
   TMP_MAX	The minimum number of unique filenames generated by tmpnam
		(and tempnam when it uses tmpnam's name space),
		or tempnam (the two are separate).
   L_ctermid	How long an array to pass to `ctermid'.
   L_cuserid	How long an array to pass to `cuserid'.
   FOPEN_MAX	Minimum number of files that can be open at once.
   FILENAME_MAX	Maximum length of a filename.  */
// 获取以下值:
// L_tmpnam:必须传递给 `tmpnam` 函数的字符数组的长度
// TMP_MAX:`tmpnam` 生成的唯一文件名的最小数量,或者 `tempnam` 使用 `tmpnam` 命名空间时生成的最小数量
// L_ctermid:传递给 `ctermid` 函数的字符数组的长度
// L_cuserid:传递给 `cuserid` 函数的字符数组的长度
// FOPEN_MAX:一次可以打开的文件的最小数量
// FILENAME_MAX:文件名的最大长度
#include <bits/stdio_lim.h>


/* Standard streams.  */
// 标准流
extern struct _IO_FILE *stdin;		/* Standard input stream.  */
// 标准输入流
extern struct _IO_FILE *stdout;		/* Standard output stream.  */
// 标准输出流
extern struct _IO_FILE *stderr;		/* Standard error output stream.  */
// 标准错误输出流
/* C89/C99 say they're macros.  Make them happy.  */
// C89/C99 规范规定它们是宏。 让它们高兴。
#define stdin stdin
// 将 stdin 宏定义为 stdin
#define stdout stdout
// 将 stdout 宏定义为 stdout
#define stderr stderr
// 将 stderr 宏定义为 stderr

__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Remove file FILENAME.  */
// 删除文件 FILENAME
extern int remove (const char *__filename) __THROW;
// 定义 remove 函数,删除指定的文件
/* Rename file OLD to NEW.  */
// 将文件 OLD 重命名为 NEW
extern int rename (const char *__old, const char *__new) __THROW;
// 定义 rename 函数,将指定的文件重命名
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间

#ifdef __USE_ATFILE
// 如果使用了 ATFILE 扩展,则执行以下内容
/* Rename file OLD relative to OLDFD to NEW relative to NEWFD.  */
// 将相对于 OLDFD 的文件 OLD 重命名为相对于 NEWFD 的文件 NEW
extern int renameat (int __oldfd, const char *__old, int __newfd,
                     const char *__new) __THROW;
// 定义 renameat 函数,将指定的文件重命名
#endif

__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Create a temporary file and open it read/write.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 创建一个临时文件并以读/写方式打开。
// 该函数可能是取消点,因此没有标记为 __THROW。
#ifndef __USE_FILE_OFFSET64
// 如果未使用大文件支持,则执行以下内容
extern FILE *tmpfile (void) __wur;
// 定义 tmpfile 函数,创建临时文件并以读/写方式打开
#else
// 如果使用了大文件支持,则执行以下内容
# ifdef __REDIRECT
extern FILE *__REDIRECT (tmpfile, (void), tmpfile64) __wur;
// 使用重定向方式定义 tmpfile 函数
# else
#  define tmpfile tmpfile64
// 将 tmpfile 宏定义为 tmpfile64
# endif
#endif
#ifdef __USE_LARGEFILE64
// 如果使用了大文件支持,则执行以下内容
extern FILE *tmpfile64 (void) __wur;
// 定义 tmpfile64 函数,创建临时文件并以读/写方式打开
#endif

/* Generate a temporary filename.  */
// 生成一个临时文件名
extern char *tmpnam (char *__s) __THROW __wur;
// 定义 tmpnam 函数,生成一个临时文件名
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间

#ifdef __USE_MISC
// 如果使用了 MISC 扩展,则执行以下内容
/* This is the reentrant variant of `tmpnam'.  The only difference is
   that it does not allow S to be NULL.  */
// 这是 `tmpnam` 的可重入变体。 唯一的区别是不允许 S 为 NULL。
extern char *tmpnam_r (char *__s) __THROW __wur;
// 定义 tmpnam_r 函数,这是 tmpnam 的可重入变体
#endif


#if defined __USE_MISC || defined __USE_XOPEN
// 如果使用了 MISC 扩展或者 XOPEN 扩展,则执行以下内容
/* Generate a unique temporary filename using up to five characters of PFX
   if it is not NULL.  The directory to put this file in is searched for
   as follows: First the environment variable "TMPDIR" is checked.
   If it contains the name of a writable directory, that directory is used.
   If not and if DIR is not NULL, that value is checked.  If that fails,
   P_tmpdir is tried and finally "/tmp".  The storage for the filename
   is allocated by `malloc'.  */
// 使用 PFX 的最多五个字符生成唯一的临时文件名,如果 PFX 不为 NULL。
// 用于放置此文件的目录的搜索顺序如下:
// 首先检查环境变量 "TMPDIR"。 如果它包含可写目录的名称,则使用该目录。
// 如果没有,且 DIR 不为 NULL,则检查该值。 如果失败,将尝试 P_tmpdir,最后尝试 "/tmp"。
// 文件名的存储由 `malloc` 分配。
extern char *tempnam (const char *__dir, const char *__pfx)
     __THROW __attribute_malloc__ __wur;
// 定义 tempnam 函数,生成唯一的临时文件名
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Close STREAM.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 关闭流 STREAM。
// 该函数可能是取消点,因此没有标记为 __THROW。
extern int fclose (FILE *__stream);
// 定义 fclose 函数,关闭指定的流
/* Flush STREAM, or all streams if STREAM is NULL.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 刷新流 STREAM,如果 STREAM 为 NULL,则刷新所有流。
// 该函数可能是取消点,因此没有标记为 __THROW。
extern int fflush (FILE *__stream);
// 定义 fflush 函数,刷新指定的流
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间

#ifdef __USE_MISC
// 如果使用了 MISC 扩展,则执行以下内容
/* Faster versions when locking is not required.
   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 不需要锁定时的更快版本。
// 该函数不是 POSIX 的一部分,因此不是官方取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,
// 因此没有标记为 __THROW。
extern int fflush_unlocked (FILE *__stream);
// 定义 fflush_unlocked 函数,刷新指定的流(无需锁定)
#endif

#ifdef __USE_GNU
// 如果使用了 GNU 扩展,则执行以下内容
/* Close all streams.
   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 关闭所有流。
// 该函数不是 POSIX 的一部分,因此不是官方取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,
// 因此没有标记为 __THROW。
extern int fcloseall (void);
// 定义 fcloseall 函数,关闭所有流
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
#ifndef __USE_FILE_OFFSET64
// 如果未使用大文件支持,则执行以下内容
/* Open a file and create a new stream for it.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 打开文件并为其创建新流。
// 该函数可能是取消点,因此没有标记为 __THROW。
extern FILE *fopen (const char *__restrict __filename,
                    const char *__restrict __modes) __wur;
// 定义 fopen 函数,打开指定的文件
/* Open a file, replacing an existing stream with it.
   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 打开文件,用它替换现有的流。
// 该函数可能是取消点,因此没有标记为 __THROW。
extern FILE *freopen (const char *__restrict __filename,
                      const char *__restrict __modes,
                      FILE *__restrict __stream) __wur;
// 定义 freopen 函数,打开指定的文件并替换现有的流
#else
// 如果使用了大文件支持,则执行以下内容
# ifdef __REDIRECT
extern FILE *__REDIRECT (fopen, (const char *__restrict __filename,
                                 const char *__restrict __modes), fopen64)
  __wur;
// 使用重定向方式定义 fopen 函数
extern FILE *__REDIRECT (freopen, (const char *__restrict __filename,
                                    const char *__restrict __modes,
                                    FILE *__restrict __stream), freopen64)
  __wur;
// 使用重定向方式定义 freopen 函数
# else
#  define fopen fopen64
// 将 fopen 宏定义为 fopen64
#  define freopen freopen64
// 将 freopen 宏定义为 freopen64
# endif
#endif
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间
#ifdef __USE_LARGEFILE64
// 如果使用了大文件支持,则执行以下内容
extern FILE *fopen64 (const char *__restrict __filename,
                      const char *__restrict __modes) __wur;
// 定义 fopen64 函数,打开指定的文件
extern FILE *freopen64 (const char *__restrict __filename,
                        const char *__restrict __modes,
                        FILE *__restrict __stream) __wur;
// 定义 freopen64 函数,打开指定的文件并替换现有的流
#endif
#ifdef	__USE_POSIX
/* Create a new stream that refers to an existing system file descriptor.  */
// 创建一个新的流,该流引用现有的系统文件描述符。
extern FILE *fdopen (int __fd, const char *__modes) __THROW __wur;
// 声明 fdopen 函数,用于创建一个新的流
#endif

#ifdef	__USE_GNU
/* Create a new stream that refers to the given magic cookie,
   and uses the given functions for input and output.  */
// 创建一个新的流,该流引用给定的魔术 Cookie,并使用给定的输入和输出函数。
extern FILE *fopencookie (void *__restrict __magic_cookie,
                          const char *__restrict __modes,
                          _IO_cookie_io_functions_t __io_funcs) __THROW __wur;
// 声明 fopencookie 函数,用于创建一个新的流
#endif

#ifdef __USE_XOPEN2K8
/* Create a new stream that refers to a memory buffer.  */
// 创建一个新的流,该流引用一个内存缓冲区。
extern FILE *fmemopen (void *__s, size_t __len, const char *__modes)
  __THROW __wur;
// 声明 fmemopen 函数,用于创建一个新的流
/* Open a stream that writes into a malloc'd buffer that is expanded as
   necessary.  *BUFLOC and *SIZELOC are updated with the buffer's location
   and the number of characters written on fflush or fclose.  */
// 打开一个写入到 malloc 分配的缓冲区的流,根据需要进行扩展。
// *BUFLOC 和 *SIZELOC 将被更新为缓冲区的位置,以及在 fflush 或 fclose 时写入的字符数。
extern FILE *open_memstream (char **__bufloc, size_t *__sizeloc) __THROW __wur;
// 声明 open_memstream 函数,用于打开一个写入到 malloc 分配的缓冲区的流
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* If BUF is NULL, make STREAM unbuffered.
   Else make it use buffer BUF, of size BUFSIZ.  */
// 如果 BUF 为 NULL,则使流 STREAM 无缓冲。
// 否则,使用大小为 BUFSIZ 的缓冲区 BUF。
extern void setbuf (FILE *__restrict __stream, char *__restrict __buf) __THROW;
// 声明 setbuf 函数,用于设置流的缓冲方式
/* Make STREAM use buffering mode MODE.
   If BUF is not NULL, use N bytes of it for buffering;
   else allocate an internal buffer N bytes long.  */
// 使流 STREAM 使用缓冲模式 MODE。
// 如果 BUF 不为 NULL,则使用它的 N 个字节进行缓冲;
// 否则,分配一个长度为 N 字节的内部缓冲区。
extern int setvbuf (FILE *__restrict __stream, char *__restrict __buf,
                    int __modes, size_t __n) __THROW;
// 声明 setvbuf 函数,用于设置流的缓冲方式
__END_NAMESPACE_STD
// 结束 C++ 标准命名空间

#ifdef	__USE_MISC
/* If BUF is NULL, make STREAM unbuffered.
   Else make it use SIZE bytes of BUF for buffering.  */
// 如果 BUF 为 NULL,则使流 STREAM 无缓冲。
// 否则,使用 BUF 的 SIZE 字节进行缓冲。
extern void setbuffer (FILE *__restrict __stream, char *__restrict __buf,
                       size_t __size) __THROW;
// 声明 setbuffer 函数,用于设置流的缓冲方式
/* Make STREAM line-buffered.  */
// 使流 STREAM 成为行缓冲。
extern void setlinebuf (FILE *__stream) __THROW;
// 声明 setlinebuf 函数,用于设置流为行缓冲模式
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Write formatted output to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将格式化输出写入到流 STREAM。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fprintf (FILE *__restrict __stream,
                    const char *__restrict __format, ...);
// 声明 fprintf 函数,用于向流中写入格式化输出
/* Write formatted output to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将格式化输出写入到 stdout。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int printf (const char *__restrict __format, ...);
// 声明 printf 函数,用于向标准输出流中写入格式化输出
/* Write formatted output to S.  */
// 将格式化输出写入到 S。
extern int sprintf (char *__restrict __s,
                    const char *__restrict __format, ...) __THROWNL;
// 声明 sprintf 函数,用于向字符串中写入格式化输出

/* Write formatted output to S from argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从参数列表 ARG 中向 S 写入格式化输出。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int vfprintf (FILE *__restrict __s, const char *__restrict __format,
                     _G_va_list __arg);
// 声明 vfprintf 函数,用于从参数列表中向流中写入格式化输出
/* Write formatted output to stdout from argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从参数列表 ARG 中向 stdout 写入格式化输出。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int vprintf (const char *__restrict __format, _G_va_list __arg);
// 声明 vprintf 函数,用于从参数列表中向标准输出流中写入格式化输出
/* Write formatted output to S from argument list ARG.  */
// 从参数列表 ARG 中向 S 写入格式化输出。
extern int vsprintf (char *__restrict __s, const char *__restrict __format,
                     _G_va_list __arg) __THROWNL;
// 声明 vsprintf 函数,用于从参数列表中向字符串中写入格式化输出
__END_NAMESPACE_STD

#if defined __USE_ISOC99 || defined __USE_UNIX98
__BEGIN_NAMESPACE_C99
// 进入 C99 标准命名空间
/* Maximum chars of output to write in MAXLEN.  */
// 写入到 MAXLEN 中的最大字符数。
extern int snprintf (char *__restrict __s, size_t __maxlen,
                     const char *__restrict __format, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 3, 4)));
// 声明 snprintf 函数,用于向字符串中写入格式化输出
extern int vsnprintf (char *__restrict __s, size_t __maxlen,
                      const char *__restrict __format, _G_va_list __arg)
     __THROWNL __attribute__ ((__format__ (__printf__, 3, 0)));
// 声明 vsnprintf 函数,用于从参数列表中向字符串中写入格式化输出
__END_NAMESPACE_C99
// 退出 C99 标准命名空间
#endif

#ifdef __USE_GNU
/* Write formatted output to a string dynamically allocated with `malloc'.
   Store the address of the string in *PTR.  */
// 将格式化输出写入到使用 `malloc` 动态分配的字符串中。
// 将字符串的地址存储在 *PTR 中。
extern int vasprintf (char **__restrict __ptr, const char *__restrict __f,
                      _G_va_list __arg)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 0))) __wur;
// 声明 vasprintf 函数,用于向动态分配的字符串中写入格式化输出
extern int __asprintf (char **__restrict __ptr,
                       const char *__restrict __fmt, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
// 声明 __asprintf 函数,用于向动态分配的字符串中写入格式化输出
extern int asprintf (char **__restrict __ptr,
                     const char *__restrict __fmt, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
// 声明 asprintf 函数,用于向动态分配的字符串中写入格式化输出
#endif
#ifdef __USE_XOPEN2K8
/* Write formatted output to a file descriptor.  */
// 向文件描述符写入格式化输出。
extern int vdprintf (int __fd, const char *__restrict __fmt,
                     _G_va_list __arg)
     __attribute__ ((__format__ (__printf__, 2, 0)));
// 声明 vdprintf 函数,用于向文件描述符写入格式化输出
extern int dprintf (int __fd, const char *__restrict __fmt, ...)
     __attribute__ ((__format__ (__printf__, 2, 3)));
// 声明 dprintf 函数,用于向文件描述符写入格式化输出
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Read formatted input from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从流中读取格式化输入。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fscanf (FILE *__restrict __stream,
                   const char *__restrict __format, ...) __wur;
// 声明 fscanf 函数,用于从流中读取格式化输入
/* Read formatted input from stdin.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从 stdin 中读取格式化输入。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int scanf (const char *__restrict __format, ...) __wur;
// 声明 scanf 函数,用于从标准输入中读取格式化输入
/* Read formatted input from S.  */
// 从 S 中读取格式化输入。
extern int sscanf (const char *__restrict __s,
                   const char *__restrict __format, ...) __THROW;
// 声明 sscanf 函数,用于从字符串中读取格式化输入

#if defined __USE_ISOC99 && !defined __USE_GNU \
    && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
    && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
# ifdef __REDIRECT
/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[
   GNU extension which conflicts with valid %a followed by letter
   s, S or [.  */
extern int __REDIRECT (fscanf, (FILE *__restrict __stream,
                                 const char *__restrict __format, ...),
                         __isoc99_fscanf) __wur;
extern int __REDIRECT (scanf, (const char *__restrict __format, ...),
                         __isoc99_scanf) __wur;
extern int __REDIRECT_NTH (sscanf, (const char *__restrict __s,
                                      const char *__restrict __format, ...),
                              __isoc99_sscanf);
# else
extern int __isoc99_fscanf (FILE *__restrict __stream,
                              const char *__restrict __format, ...) __wur;
extern int __isoc99_scanf (const char *__restrict __format, ...) __wur;
extern int __isoc99_sscanf (const char *__restrict __s,
                               const char *__restrict __format, ...) __THROW;
#  define fscanf __isoc99_fscanf
#  define scanf __isoc99_scanf
#  define sscanf __isoc99_sscanf
# endif
#endif

__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

#ifdef __USE_ISOC99
__BEGIN_NAMESPACE_C99
// 进入 C99 标准命名空间
/* Read formatted input from S into argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将从 S 中读取的格式化输入写入参数列表 ARG。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int vfscanf (FILE *__restrict __s, const char *__restrict __format,
                    _G_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;

/* Read formatted input from stdin into argument list ARG.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将从 stdin 中读取的格式化输入写入参数列表 ARG。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int vscanf (const char *__restrict __format, _G_va_list __arg)
     __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;

/* Read formatted input from S into argument list ARG.  */
// 将从 S 中读取的格式化输入写入参数列表 ARG。
extern int vsscanf (const char *__restrict __s,
                    const char *__restrict __format, _G_va_list __arg)
     __THROW __attribute__ ((__format__ (__scanf__, 2, 0)));

# if !defined __USE_GNU \
     && (!defined __LDBL_COMPAT || !defined __REDIRECT) \
     && (defined __STRICT_ANSI__ || defined __USE_XOPEN2K)
#  ifdef __REDIRECT
/* For strict ISO C99 or POSIX compliance disallow %as, %aS and %a[
   GNU extension which conflicts with valid %a followed by letter
   s, S or [.  */
extern int __REDIRECT (vfscanf,
                         (FILE *__restrict __s,
                          const char *__restrict __format, _G_va_list __arg),
                         __isoc99_vfscanf)
     __attribute__ ((__format__ (__scanf__, 2, 0))) __wur;
extern int __REDIRECT (vscanf, (const char *__restrict __format,
                                 _G_va_list __arg), __isoc99_vscanf)
     __attribute__ ((__format__ (__scanf__, 1, 0))) __wur;
extern int __REDIRECT_NTH (vsscanf,
                              (const char *__restrict __s,
                               const char *__restrict __format,
                               _G_va_list __arg), __isoc99_vsscanf)
     __attribute__ ((__format__ (__scanf__, 2, 0)));
#  else
extern int __isoc99_vfscanf (FILE *__restrict __s,
                                const char *__restrict __format,
                                _G_va_list __arg) __wur;
extern int __isoc99_vscanf (const char *__restrict __format,
                               _G_va_list __arg) __wur;
extern int __isoc99_vsscanf (const char *__restrict __s,
                                const char *__restrict __format,
                                _G_va_list __arg) __THROW;
#   define vfscanf __isoc99_vfscanf
#   define vscanf __isoc99_vscanf
#   define vsscanf __isoc99_vsscanf
#  endif
# endif

__END_NAMESPACE_C99
// 退出 C99 标准命名空间
#endif /* Use ISO C9x.  */
__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Read a character from STREAM.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
// 从流中读取一个字符。
// 这些函数可能是取消点,因此没有标记为 __THROW。
extern int fgetc (FILE *__stream);
// 声明 fgetc 函数,用于从流中读取一个字符
extern int getc (FILE *__stream);
// 声明 getc 函数,用于从流中读取一个字符

/* Read a character from stdin.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从 stdin 中读取一个字符。
// 此函数可能是取消点,因此没有标记为 __THROW。
extern int getchar (void);
// 声明 getchar 函数,用于从 stdin 中读取一个字符
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

/* The C standard explicitly says this is a macro, so we always do the
   optimization for it.  */
// C 标准明确表示这是一个宏,因此我们始终对其进行优化。
#define getc(_fp) _IO_getc (_fp)
// 将 getc 宏定义为 _IO_getc(_fp)

#ifdef __USE_POSIX
/* These are defined in POSIX.1:1996.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
// 这些函数在 POSIX.1:1996 中定义。

// 这些函数可能是取消点,因此没有标记为 __THROW。
extern int getc_unlocked (FILE *__stream);
// 声明 getc_unlocked 函数,用于从流中读取一个字符,不锁定流
extern int getchar_unlocked (void);
// 声明 getchar_unlocked 函数,用于从 stdin 中读取一个字符,不锁定流
#endif /* Use POSIX.  */

#ifdef __USE_MISC
/* Faster version when locking is not necessary.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 不需要锁定时的快速版本。

// 该函数不是 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,因此没有标记为 __THROW。
extern int fgetc_unlocked (FILE *__stream);
// 声明 fgetc_unlocked 函数,用于从流中读取一个字符,不需要锁定流
#endif /* Use MISC.  */


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Write a character to STREAM.

   These functions are possible cancellation points and therefore not
   marked with __THROW.

   These functions is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将一个字符写入流。

// 这些函数可能是取消点,因此没有标记为 __THROW。

// 这些函数可能是取消点,因此没有标记为 __THROW。
extern int fputc (int __c, FILE *__stream);
// 声明 fputc 函数,用于将一个字符写入流
extern int putc (int __c, FILE *__stream);
// 声明 putc 函数,用于将一个字符写入流

/* Write a character to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将一个字符写入 stdout。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int putchar (int __c);
// 声明 putchar 函数,用于将一个字符写入 stdout
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

/* The C standard explicitly says this can be a macro,
   so we always do the optimization for it.  */
// C 标准明确表示这可以是一个宏,因此我们始终对其进行优化。
#define putc(_ch, _fp) _IO_putc (_ch, _fp)
// 将 putc 宏定义为 _IO_putc(_ch, _fp)

#ifdef __USE_MISC
/* Faster version when locking is not necessary.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 不需要锁定时的快速版本。

// 该函数不是 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,因此没有标记为 __THROW。
extern int fputc_unlocked (int __c, FILE *__stream);
// 声明 fputc_unlocked 函数,用于将一个字符写入流,不需要锁定流
#endif /* Use MISC.  */

#ifdef __USE_POSIX
/* These are defined in POSIX.1:1996.

   These functions are possible cancellation points and therefore not
   marked with __THROW.  */
// 这些函数在 POSIX.1:1996 中定义。

// 这些函数可能是取消点,因此没有标记为 __THROW。
extern int putc_unlocked (int __c, FILE *__stream);
// 声明 putc_unlocked 函数,用于将一个字符写入流,不锁定流
extern int putchar_unlocked (int __c);
// 声明 putchar_unlocked 函数,用于将一个字符写入 stdout,不锁定流
#endif /* Use POSIX.  */


#if defined __USE_MISC \
    || (defined __USE_XOPEN && !defined __USE_XOPEN2K)
/* Get a word (int) from STREAM.  */
// 从流中获取一个 word(int)。
extern int getw (FILE *__stream);

/* Write a word (int) to STREAM.  */
// 将一个 word(int)写入流。
extern int putw (int __w, FILE *__stream);
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Get a newline-terminated string of finite length from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从流中获取以换行符结尾的有限长度的字符串。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern char *fgets (char *__restrict __s, int __n, FILE *__restrict __stream)
     __wur;

#if !defined __USE_ISOC11 \
    || (defined __cplusplus && __cplusplus <= 201103L)
/* Get a newline-terminated string from stdin, removing the newline.
   DO NOT USE THIS FUNCTION!!  There is no limit on how much it will read.

   The function has been officially removed in ISO C11.  This opportunity
   is used to also remove it from the GNU feature list.  It is now only
   available when explicitly using an old ISO C, Unix, or POSIX standard.
   GCC defines _GNU_SOURCE when building C++ code and the function is still
   in C++11, so it is also available for C++.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从 stdin 中获取一个以换行符结尾的字符串,并删除换行符。
// 不要使用此函数!!它会读取多少内容没有限制。

// 该函数在 ISO C11 中已被官方移除。这次机会也用于将其从 GNU 功能列表中移除。
// 现在,只有在明确使用旧的 ISO C、Unix 或 POSIX 标准时才可用。
// 当构建 C++ 代码时,GCC 定义 _GNU_SOURCE,并且该函数仍然存在于 C++11 中,因此它也适用于 C++。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern char *gets (char *__s) __wur __attribute_deprecated__;
// 声明 gets 函数,用于从 stdin 中获取一个以换行符结尾的字符串,并删除换行符,不推荐使用
#endif
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

#ifdef __USE_GNU
/* This function does the same as `fgets' but does not lock the stream.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 此函数与 `fgets` 函数相同,但不锁定流。

// 此函数不属于 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,因此没有标记为 __THROW。
extern char *fgets_unlocked (char *__restrict __s, int __n,
			     FILE *__restrict __stream) __wur;
// 声明 fgets_unlocked 函数,用于从流中获取一个以换行符结尾的有限长度的字符串,不锁定流
#endif
#ifdef	__USE_XOPEN2K8
// 如果使用了 __USE_XOPEN2K8 宏定义

/* Read up to (and including) a DELIMITER from STREAM into *LINEPTR
   (and null-terminate it). *LINEPTR is a pointer returned from malloc (or
   NULL), pointing to *N characters of space.  It is realloc'd as
   necessary.  Returns the number of characters read (not including the
   null terminator), or -1 on error or EOF.

   These functions are not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation they are cancellation points and
   therefore not marked with __THROW.  */
// 从流中读取直到(包括)DELIMITER的字符到*LINEPTR(并以 null 结尾)。
// *LINEPTR 是从 malloc(或 NULL)返回的指针,指向 *N 个字符的空间。
// 根据需要进行 realloc。返回读取的字符数(不包括 null 终止符),或者在错误或 EOF 时返回 -1。
extern _IO_ssize_t __getdelim (char **__restrict __lineptr,
			       size_t *__restrict __n, int __delimiter,
			       FILE *__restrict __stream) __wur;
// 声明 __getdelim 函数,用于从流中读取直到(包括)DELIMITER的字符到*LINEPTR,以 null 结尾
extern _IO_ssize_t getdelim (char **__restrict __lineptr,
			     size_t *__restrict __n, int __delimiter,
			     FILE *__restrict __stream) __wur;
// 声明 getdelim 函数,用于从流中读取直到(包括)DELIMITER的字符到*LINEPTR,以 null 结尾

/* Like `getdelim', but reads up to a newline.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 类似于 `getdelim`,但读取直到换行符。

// 此函数不属于 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,因此没有标记为 __THROW。
extern _IO_ssize_t getline (char **__restrict __lineptr,
			    size_t *__restrict __n,
			    FILE *__restrict __stream) __wur;
// 声明 getline 函数,类似于 `getdelim`,但读取直到换行符
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Write a string to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 向流中写入一个字符串。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fputs (const char *__restrict __s, FILE *__restrict __stream);
// 声明 fputs 函数,用于向流中写入一个字符串

/* Write a string, followed by a newline, to stdout.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 向 stdout 中写入一个字符串,后跟一个换行符。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int puts (const char *__s);
// 声明 puts 函数,用于向 stdout 中写入一个字符串,后跟一个换行符


/* Push a character back onto the input buffer of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将一个字符推回到流的输入缓冲区中。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int ungetc (int __c, FILE *__stream);
// 声明 ungetc 函数,用于将一个字符推回到流的输入缓冲区中


/* Read chunks of generic data from STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 从流中读取一段通用数据块。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern size_t fread (void *__restrict __ptr, size_t __size,
		     size_t __n, FILE *__restrict __stream) __wur;
// 声明 fread 函数,用于从流中读取一段通用数据块

/* Write chunks of generic data to STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 将一段通用数据块写入到流中。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern size_t fwrite (const void *__restrict __ptr, size_t __size,
		      size_t __n, FILE *__restrict __s);
// 声明 fwrite 函数,用于将一段通用数据块写入到流中
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

#ifdef __USE_GNU
// 如果使用了 __USE_GNU 宏定义

/* This function does the same as `fputs' but does not lock the stream.

   This function is not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation it is a cancellation point and
   therefore not marked with __THROW.  */
// 此函数与 `fputs` 函数相同,但不锁定流。

// 此函数不属于 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它是一个取消点,因此没有标记为 __THROW。
extern int fputs_unlocked (const char *__restrict __s,
			   FILE *__restrict __stream);
// 声明 fputs_unlocked 函数,用于向流中写入一个字符串,不锁定流
#endif

#ifdef __USE_MISC
// 如果使用了 __USE_MISC 宏定义

/* Faster versions when locking is not necessary.

   These functions are not part of POSIX and therefore no official
   cancellation point.  But due to similarity with an POSIX interface
   or due to the implementation they are cancellation points and
   therefore not marked with __THROW.  */
// 当不需要锁定时的更快版本。

// 这些函数不属于 POSIX 的一部分,因此没有官方的取消点。
// 但由于与 POSIX 接口的相似性或由于实现,它们是取消点,因此没有标记为 __THROW。
extern size_t fread_unlocked (void *__restrict __ptr, size_t __size,
			      size_t __n, FILE *__restrict __stream) __wur;
// 声明 fread_unlocked 函数,用于从流中读取一段通用数据块,不锁定流
extern size_t fwrite_unlocked (const void *__restrict __ptr, size_t __size,
			       size_t __n, FILE *__restrict __stream);
// 声明 fwrite_unlocked 函数,用于将一段通用数据块写入到流中,不锁定流
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Seek to a certain position on STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 在流上定位到某个位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fseek (FILE *__stream, long int __off, int __whence);
// 声明 fseek 函数,用于在流上定位到某个位置

/* Return the current position of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 返回流的当前位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern long int ftell (FILE *__stream) __wur;
// 声明 ftell 函数,返回流的当前位置

/* Rewind to the beginning of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 倒回到流的开头。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern void rewind (FILE *__stream);
// 声明 rewind 函数,将流倒回到开头
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

/* The Single Unix Specification, Version 2, specifies an alternative,
   more adequate interface for the two functions above which deal with
   file offset.  `long int' is not the right type.  These definitions
   are originally defined in the Large File Support API.  */

#if defined __USE_LARGEFILE || defined __USE_XOPEN2K
# ifndef __USE_FILE_OFFSET64
/* Seek to a certain position on STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 在流上定位到某个位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fseeko (FILE *__stream, __off_t __off, int __whence);
// 声明 fseeko 函数,用于在流上定位到某个位置

/* Return the current position of STREAM.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 返回流的当前位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern __off_t ftello (FILE *__stream) __wur;
// 声明 ftello 函数,返回流的当前位置
# else
#  ifdef __REDIRECT
extern int __REDIRECT (fseeko,
		       (FILE *__stream, __off64_t __off, int __whence),
		       fseeko64);
extern __off64_t __REDIRECT (ftello, (FILE *__stream), ftello64);
#  else
#   define fseeko fseeko64
#   define ftello ftello64
#  endif
# endif
#endif

__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
#ifndef __USE_FILE_OFFSET64
/* Get STREAM's position.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 获取流的位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fgetpos (FILE *__restrict __stream, fpos_t *__restrict __pos);
// 声明 fgetpos 函数,用于获取流的位置

/* Set STREAM's position.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 设置流的位置。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int fsetpos (FILE *__stream, const fpos_t *__pos);
// 声明 fsetpos 函数,用于设置流的位置
#else
# ifdef __REDIRECT
extern int __REDIRECT (fgetpos, (FILE *__restrict __stream,
				 fpos_t *__restrict __pos), fgetpos64);
extern int __REDIRECT (fsetpos,
		       (FILE *__stream, const fpos_t *__pos), fsetpos64);
# else
#  define fgetpos fgetpos64
#  define fsetpos fsetpos64
# endif
#endif
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

#ifdef __USE_LARGEFILE64
// 如果使用了 __USE_LARGEFILE64 宏定义
extern int fseeko64 (FILE *__stream, __off64_t __off, int __whence);
extern __off64_t ftello64 (FILE *__stream) __wur;
extern int fgetpos64 (FILE *__restrict __stream, fpos64_t *__restrict __pos);
extern int fsetpos64 (FILE *__stream, const fpos64_t *__pos);
#endif

__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Clear the error and EOF indicators for STREAM.  */
// 清除流的错误和 EOF 指示器。
extern void clearerr (FILE *__stream) __THROW;
// 声明 clearerr 函数,清除流的错误和 EOF 指示器

/* Return the EOF indicator for STREAM.  */
// 返回流的 EOF 指示器。
extern int feof (FILE *__stream) __THROW __wur;
// 声明 feof 函数,返回流的 EOF 指示器

/* Return the error indicator for STREAM.  */
// 返回流的错误指示器。
extern int ferror (FILE *__stream) __THROW __wur;
// 声明 ferror 函数,返回流的错误指示器
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

#ifdef __USE_MISC
// 如果使用了 __USE_MISC 宏定义
/* Faster versions when locking is not required.  */
// 当不需要锁定时的更快版本。
extern void clearerr_unlocked (FILE *__stream) __THROW;
// 声明 clearerr_unlocked 函数,清除流的错误和 EOF 指示器,不锁定流
extern int feof_unlocked (FILE *__stream) __THROW __wur;
// 声明 feof_unlocked 函数,返回流的 EOF 指示器,不锁定流
extern int ferror_unlocked (FILE *__stream) __THROW __wur;
// 声明 ferror_unlocked 函数,返回流的错误指示器,不锁定流
#endif


__BEGIN_NAMESPACE_STD
// 进入 C++ 标准命名空间
/* Print a message describing the meaning of the value of errno.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 打印一个描述 errno 值含义的消息。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern void perror (const char *__s);
// 声明 perror 函数,打印一个描述 errno 值含义的消息
__END_NAMESPACE_STD
// 退出 C++ 标准命名空间

/* Provide the declarations for `sys_errlist' and `sys_nerr' if they
   are available on this system.  Even if available, these variables
   should not be used directly.  The `strerror' function provides
   all the necessary functionality.  */
// 如果这些变量在系统上可用,则提供 `sys_errlist' 和 `sys_nerr' 的声明。
// 即使可用,也不应直接使用这些变量。`strerror` 函数提供所有必要的功能。
#include <bits/sys_errlist.h>


#ifdef	__USE_POSIX
// 如果使用了 __USE_POSIX 宏定义
/* Return the system file descriptor for STREAM.  */
// 返回流的系统文件描述符。
extern int fileno (FILE *__stream) __THROW __wur;
// 声明 fileno 函数,返回流的系统文件描述符
#endif /* Use POSIX.  */

#ifdef __USE_MISC
// 如果使用了 __USE_MISC 宏定义
/* Faster version when locking is not required.  */
// 当不需要锁定时的更快版本。
extern int fileno_unlocked (FILE *__stream) __THROW __wur;
// 声明 fileno_unlocked 函数,返回流的系统文件描述符,不锁定流
#endif


#ifdef __USE_POSIX2
// 如果使用了 __USE_POSIX2 宏定义
/* Create a new stream connected to a pipe running the given command.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 创建一个连接到运行给定命令的管道的新流。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern FILE *popen (const char *__command, const char *__modes) __wur;
// 声明 popen 函数,创建一个连接到运行给定命令的管道的新流

/* Close a stream opened by popen and return the status of its child.

   This function is a possible cancellation point and therefore not
   marked with __THROW.  */
// 关闭由 popen 打开的流,并返回其子进程的状态。

// 此函数可能是取消点,因此没有标记为 __THROW。
extern int pclose (FILE *__stream);
// 声明 pclose 函数,关闭由 popen 打开的流,并返回其子进程的状态
#endif


#ifdef	__USE_POSIX
// 如果使用了 __USE_POSIX 宏定义
/* Return the name of the controlling terminal.  */
// 返回控制终端的名称。
extern char *ctermid (char *__s) __THROW;
// 声明 ctermid 函数,返回控制终端的名称
#endif /* Use POSIX.  */


#ifdef __USE_XOPEN
// 如果使用了 __USE_XOPEN 宏定义
/* Return the name of the current user.  */
// 返回当前用户的名称。
extern char *cuserid (char *__s);
// 声明 cuserid 函数,返回当前用户的名称
#endif /* Use X/Open, but not issue 6.  */


#ifdef	__USE_GNU
// 如果使用了 __USE_GNU 宏定义
struct obstack;			/* See <obstack.h>.  */

/* Write formatted output to an obstack.  */
// 将格式化输出写入 obstack。
extern int obstack_printf (struct obstack *__restrict __obstack,
			   const char *__restrict __format, ...)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 3)));
// 声明 obstack_printf 函数,将格式化输出写入 obstack

extern int obstack_vprintf (struct obstack *__restrict __obstack,
			    const char *__restrict __format,
			    _G_va_list __args)
     __THROWNL __attribute__ ((__format__ (__printf__, 2, 0)));
// 声明 obstack_vprintf 函数,将格式化输出写入 obstack,使用参数列表
#endif /* Use GNU.  */


#ifdef __USE_POSIX
// 如果使用了 __USE_POSIX 宏定义
/* These are defined in POSIX.1:1996.  */

/* Acquire ownership of STREAM.  */
// 获取 STREAM 的所有权。
extern void flockfile (FILE *__stream) __THROW;
// 声明 flockfile 函数,获取 STREAM 的所有权

/* Try to acquire ownership of STREAM but do not block if it is not
   possible.  */
// 尝试获取 STREAM 的所有权,但如果不可能则不阻塞。
extern int ftrylockfile (FILE *__stream) __THROW __wur;
// 声明 ftrylockfile 函数,尝试获取 STREAM 的所有权,不阻塞

/* Relinquish the ownership granted for STREAM.  */
// 放弃对 STREAM 授予的所有权。
extern void funlockfile (FILE *__stream) __THROW;
// 声明 funlockfile 函数,放弃对 STREAM 授予的所有权
#endif /* POSIX */

#if defined __USE_XOPEN && !defined __USE_XOPEN2K && !defined __USE_GNU
/* The X/Open standard requires some functions and variables to be
   declared here which do not belong into this header.  But we have to
   follow.  In GNU mode we don't do this nonsense.  */
# define __need_getopt
# include <getopt.h>
#endif	/* X/Open, but not issue 6 and not for GNU.  */

/* If we are compiling with optimizing read this file.  It contains
   several optimizing inline functions and macros.  */
// 如果使用优化读取此文件。它包含几个优化内联函数和宏。
#ifdef __USE_EXTERN_INLINES
# include <bits/stdio.h>
#endif
#if __USE_FORTIFY_LEVEL > 0 && defined __fortify_function
# include <bits/stdio2.h>
#endif
#ifdef __LDBL_COMPAT
# include <bits/stdio-ldbl.h>
#endif

__END_DECLS

#endif /* <stdio.h> included.  */

#endif /* !_STDIO_H */

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值