мета-данные страницы
  •  

Это старая версия документа!


stdio.h

заголовочник, объявляющий интерфейс стандартного ввода-вывода в языке C. Предоставляет типы, макросы и функции для работы с потоками, файлами, буферами и форматированным вводом/выводом.

#include <stdio.h>
 
typedef struct FILE FILE;        /* абстракция потока ввода/вывода */
 
extern FILE *stdin;              /* стандартный ввод */
extern FILE *stdout;             /* стандартный вывод */
extern FILE *stderr;             /* стандартный вывод ошибок */
 
int printf(const char *format, ...);                  /* форматированный вывод в stdout */
int fprintf(FILE *stream, const char *format, ...);   /* форматированный вывод в поток */
int sprintf(char *str, const char *format, ...);      /* форматированный вывод в буфер (без огранич.) */
int snprintf(char *str, size_t size, const char *format, ...); /* форматированный вывод в буфер с ограничением */
 
int scanf(const char *format, ...);                   /* форматированный ввод из stdin */
int fscanf(FILE *stream, const char *format, ...);    /* форматированный ввод из потока */
int sscanf(const char *str, const char *format, ...); /* форматированный ввод из строки */
 
FILE *fopen(const char *pathname, const char *mode);  /* открыть файл */
int fclose(FILE *stream);                             /* закрыть файл */
size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream); /* чтение блоков */
size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); /* запись блоков */
 
int fseek(FILE *stream, long offset, int whence);    /* установить позицию в файле */
long ftell(FILE *stream);                             /* получить текущую позицию */
void rewind(FILE *stream);                            /* установить позицию в начало и сброс ошибок */
 
int fflush(FILE *stream);                             /* сбросить буфер потока */
 
int fgetc(FILE *stream);          /* получить символ из потока (int, EOF) */
int getc(FILE *stream);           /* макро/функция, как fgetc */
int getchar(void);                /* получить символ из stdin */
char *fgets(char *s, int size, FILE *stream); /* чтение строки в буфер */
 
int fputc(int c, FILE *stream);   /* записать символ в поток */
int putc(int c, FILE *stream);    /* макро/функция, как fputc */
int putchar(int c);               /* записать символ в stdout */
int fputs(const char *s, FILE *stream); /* записать строку (без добавления '\n') */
int puts(const char *s);          /* записать строку и добавить перевод строки */
 
/* дополнительные полезные функции и макросы (не исчерпывающе) */
int feof(FILE *stream);            /* проверка конца файла */
int ferror(FILE *stream);          /* проверка флага ошибки */
void clearerr(FILE *stream);       /* сброс флагов EOF и ошибки */
int perror(const char *s);         /* вывести сообщение об ошибке на stderr */
int remove(const char *pathname);  /* удалить файл */
int rename(const char *old, const char *new); /* переименовать файл */
int setvbuf(FILE *stream, char *buf, int mode, size_t size); /* настроить буферизацию */
FILE *tmpfile(void);               /* создать временный файл */
char *tmpnam(char *s);             /* сгенерировать временное имя */

спецификаторы

понятия:

  • FILE — поток ввода/вывода.
  • stdin, stdout, stderr — стандартные потоки.
  • Буферизация — режимы: полная, построчная, безбуферная.
  • Форматированные функции — управление представлением данных через спецификаторы формата.
  • Блочное чтение/запись — эффективная работа с большими объёмами данных.
  • Позиционирование — перемещение и получение смещения в файле.
  • Флаги состояния — EOF и ошибка доступны через feof/ferror/clearerr.
  • Безопасность — избегать небезопасных функций и неверного использования форматных строк.

особенности:

  • Используйте snprintf и fgets вместо sprintf и gets.
  • Форматные спецификаторы должны соответствовать типам аргументов.
  • Учитывайте различия текстового/бинарного режимов на разных платформах.
  • Перед fork выполняйте fflush для корректного управления буферами.
  • При работе в многопоточном окружении синхронизируйте последовательные операции при необходимости.

пример использования:

#include <stdio.h>
 
int main(void) {
    FILE *f = fopen("example.txt", "w");    /* открыть для записи */
    if (!f) {
        perror("fopen");                    /* сообщение об ошибке */
        return 1;
    }
 
    const char *s = "Пример строки\n";
    fputs(s, f);                            /* записать строку */
 
    fprintf(f, "Число: %d\n", 42);          /* форматированный вывод */
 
    fflush(f);                              /* сброс буфера */
    fclose(f);                              /* закрыть файл */
 
    f = fopen("example.txt", "r");          /* открыть для чтения */
    if (!f) return 1;
    char buf[128];
    while (fgets(buf, sizeof buf, f)) {     /* читать построчно */
        fputs(buf, stdout);                 /* выводить в stdout */
    }
    fclose(f);
    return 0;
}