Jump to content

Ввод/вывод файла C

(Перенаправлено с Gets() )

Язык программирования C предоставляет множество стандартных библиотечных функций для файлов ввода и вывода . Эти функции составляют основную часть стандартной библиотеки C. заголовка < stdio.h > . [1] Функциональность происходит от «портативного пакета ввода-вывода», написанного Майком Леском из Bell Labs в начале 1970-х годов. [2] и официально стал частью операционной системы Unix в версии 7 . [3]

Функциональность ввода-вывода C по современным стандартам находится на довольно низком уровне; все файловые операции на операции с потоками байтов C абстрагирует , которые могут быть «входными потоками» или «выходными потоками». В отличие от некоторых более ранних языков программирования, C не имеет прямой поддержки с произвольным доступом файлов данных ; чтобы прочитать запись в середине файла, программист должен создать поток, перейти к середине файла, а затем последовательно прочитать байты из потока.

Потоковая модель файлового ввода-вывода была популяризирована Unix, которая разрабатывалась одновременно с самим языком программирования C. Подавляющее большинство современных операционных систем унаследовали потоки от Unix, а многие языки семейства языков программирования C унаследовали интерфейс файлового ввода-вывода C с небольшими изменениями, если таковые вообще были (например, PHP ).

Эта библиотека использует так называемые потоки для работы с физическими устройствами, такими как клавиатуры, принтеры, терминалы или с файлами любого другого типа, поддерживаемыми системой. Потоки — это абстракция для единообразного взаимодействия с ними. Все потоки имеют схожие свойства независимо от индивидуальных характеристик физической среды, с которой они связаны. [4]

Большинство функций ввода/вывода файла C определены в <stdio.h> (или в C++ заголовке cstdio , который содержит стандартную функциональность C, но в std пространство имен ).

Байт
характер
Широкий
характер
Описание
Доступ к файлам открыть Открывает файл (с именем файла, отличным от Unicode в Windows, и возможным именем файла UTF-8 в Linux).
свободный доступ Открывает другой файл с существующим потоком
смыть Синхронизирует выходной поток с реальным файлом
fзакрыть Закрывает файл
setbuf Устанавливает буфер для файлового потока
setvbuf Устанавливает буфер и его размер для файлового потока.
по всему миру Переключает поток файлов между вводом-выводом с широкими символами и вводом-выводом с узкими символами.
Прямой
ввод/вывод
бояться Читает из файла
написать Записывает в файл
Неформатированный
ввод/вывод
fgetc
получить
вставать
вставать
Читает байт/ wchar_t из файлового потока
fgets плод Читает байт/ строка wchar_t из файлового потока
fputc
putc
fputwc
удар
Записывает байт/ wchar_t в файловый поток
fputs fputws Записывает байт/ строка wchar_t в файловый поток
получитьчар подойти ближе Читает байт/ wchar_t из стандартного ввода
получает Считывает строку байтов из стандартного ввода до тех пор, пока не встретится новая строка или конец файла (устарело в C99, удалено из C11).
putchar шлюха Записывает байт/ wchar_t в стандартный вывод
ставит Записывает строку байтов в стандартный вывод
смазка и т. д. синглтон Помещает байт/ wchar_t обратно в файловый поток
Отформатированный
ввод/вывод
сканирование
fscanf
sscanf
wscanf
fwscanf
swscanf
Читает форматированный байт/ wchar_t со стандартного ввода, ввод
файловый поток или буфер
всканф
vfscanf
vsscanf
vwscanf
vfwscanf
vswscanf
Считывает форматированный входной байт/ wchar_t из стандартного ввода,
файловый поток или буфер с использованием списка переменных аргументов
печать
fprintf
спринтф
snprintf
wprintf
fwprintf
swprintf
Печатает форматированный байт/ вывод wchar_t на стандартный вывод,
файловый поток или буфер
vprintf
vfprintf
vsprintf
vsnprintf
vwprintf
vfwprintf
vswprintf
Печатает форматированный байт/ вывод wchar_t на стандартный вывод,
файловый поток или буфер с использованием списка переменных аргументов
ошибка Записывает описание текущей ошибки в stderr.
Позиционирование файла сказать
брат
Возвращает индикатор текущей позиции файла
fseek
из fsee
Перемещает индикатор положения файла в определенное место в файле.
fgetpost Получает индикатор позиции файла
fsetpos Перемещает индикатор положения файла в определенное место в файле.
перемотать назад Перемещает индикатор позиции файла в начало файла.
Ошибка
умение обращаться
ясно Очищает ошибки
Феоф Проверяет конец файла
ужас Проверяет наличие ошибок в файле
Операции
в файлах
удалять Стирает файл
переименовывать Переименовывает файл
tmp-файл Возвращает указатель на временный файл
tmpnam Возвращает уникальное имя файла

Константы

[ редактировать ]

Константы, определенные в Заголовок <stdio.h> включает в себя:

Имя Примечания
ЭОФ Отрицательное целое число типа int используется для обозначения условий конца файла
БЕЗ БАФА Целое число, которое представляет собой размер буфера, используемого setbuf() функция
FILENAME_MAX Размер массив символов , достаточно большой для хранения имени любого файла, который можно открыть.
FOPEN_MAX Количество файлов, которые могут быть открыты одновременно; будет минимум восемь
_ИОФБФ Аббревиатура от «полностью буферизованный ввод/вывод»; это целое число, которое можно передать в setvbuf() Функция для запроса буферизованного ввода и вывода для открытого потока
_ИОЛБФ Аббревиатура от «буферизованная строка ввода/вывода»; это целое число, которое можно передать в setvbuf() Функция для запроса строкового буферизованного ввода и вывода для открытого потока
_IONBF Сокращение от «ввод/вывод без буферизации»; это целое число, которое можно передать в Функция setvbuf() для запроса небуферизованного ввода и вывода для открытого потока
L_tmpnam Размер массив символов , достаточно большой для хранения временного имени файла, сгенерированного tmpnam() функция
НУЛЕВОЙ Макрос, расширяющийся до константы нулевого указателя ; то есть константа, представляющая значение указателя, которое гарантированно не будет действительным адресом объекта в памяти.
SEEK_CUR Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно текущей позиции файла
SEEK_END Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно конца файла
SEEK_SET Целое число, которое можно передать в Функция fseek() для запроса позиционирования относительно начала файла
ТМП_МАКС Максимальное количество уникальных имен файлов, генерируемых tmpnam() функция ; будет минимум 25

Переменные

[ редактировать ]

Переменные, определенные в Заголовок <stdio.h> включает в себя:

Имя Примечания
стандартный ввод Указатель на ФАЙЛ , который относится к стандартному потоку ввода, обычно с клавиатуры.
стандартный вывод Указатель на ФАЙЛ , который относится к стандартному потоку вывода, обычно это дисплейный терминал.
stderr Указатель на ФАЙЛ , который относится к стандартному потоку ошибок, часто это дисплейный терминал.

Типы участников

[ редактировать ]

Типы данных, определенные в Заголовок <stdio.h> включает в себя:

  • ФАЙЛ – также известный как файла дескриптор или Указатель FILE , это непрозрачный указатель , содержащий информацию о файле или текстовом потоке, необходимую для выполнения над ним операций ввода или вывода, в том числе:
    • специфичный для платформы идентификатор соответствующего устройства ввода-вывода, например файловый дескриптор
    • буфер
    • индикатор ориентации потока (не установлен, узкий или широкий)
    • индикатор состояния буферизации потока (без буферизации, с строковой буферизацией, с полной буферизацией)
    • Индикатор режима ввода-вывода (входной поток, выходной поток или поток обновления)
    • индикатор двоичного/текстового режима
    • индикатор конца файла
    • индикатор ошибки
    • текущая позиция потока и состояние многобайтового преобразования (объект типа mbstate_t)
    • возвратная блокировка (требуется начиная с C11 )
  • fpos_t – тип, не являющийся массивом, способный однозначно идентифицировать позицию каждого байта в файле и каждое состояние преобразования, которое может произойти во всех поддерживаемых многобайтовых кодировках символов.
  • size_t целочисленный тип без знака , который является типом результата sizeof . Оператор

Расширения

[ редактировать ]

Стандарт POSIX определяет несколько расширений для stdio в своих базовых определениях, среди которых функция readline , которая выделяет память, файлено и функции fdopen , которые устанавливают связь между Объекты FILE и файловые дескрипторы , а также группа функций для создания Объекты FILE , которые ссылаются на буферы в памяти. [5]

Следующая программа на языке C открывает двоичный файл с именем myfile , считывает из него пять байтов, а затем закрывает файл.

#include <stdio.h>
#include <stdlib.h>

int main(void) {
    char buffer[5];
    FILE* fp = fopen("myfile", "rb");

    if (fp == NULL) {
        perror("Failed to open file \"myfile\"");
        return EXIT_FAILURE;
    }

    if (fread(buffer, 1, 5, fp) < 5) {
        fputs("An error occurred while reading the file.\n", stderr);
        return EXIT_FAILURE;
    }

    fclose(fp);

    printf("The bytes read were: ");
    for (int i = 0; i < 5; ++i) {
        printf("%02X ", buffer[i]);
    }
    putchar('\n');

    return EXIT_SUCCESS;
}

Альтернативы stdio

[ редактировать ]

Несколько альтернатив stdio были разработаны. Среди них C++ iostream , часть стандарта ISO C++ . ISO C++ по-прежнему требует функциональность stdio .

Другие альтернативы включают Sfio. [6] (Библиотека безопасного/быстрого ввода-вывода) от AT&T Bell Laboratories . Эта библиотека, представленная в 1991 году, была призвана избежать несоответствий, небезопасных практик и неэффективности при разработке стдио . Среди его особенностей — возможность вставлять в поток функции обратного вызова для настройки обработки данных, считываемых из потока или записываемых в него. [7] Он был выпущен для внешнего мира в 1997 году, а последний релиз состоялся 1 февраля 2005 года. [8]

См. также

[ редактировать ]
  1. ^ Спецификация ISO/IEC 9899:1999 . п. 274, § 7.19.
  2. ^ Керниган, Брайан ; Пайк, Роб (1984). Среда программирования UNIX . Энглвудские скалы : Прентис-холл . п. 200.
  3. ^ Макилрой, доктор медицины (1987). Читатель Research Unix: аннотированные выдержки из Руководства программиста, 1971–1986 (PDF) (Технический отчет). CSTR. Лаборатории Белла. 139.
  4. ^ "(stdio.h) — Справочник по C++" . С++ . Проверено 25 июля 2021 г.
  5. ^ stdio.h – Справочник базовых определений, Единая спецификация UNIX , версия 4 от Open Group.
  6. ^ «Sfio: безопасная/быстрая библиотека ввода-вывода» . Архивировано из оригинала 11 февраля 2006 года . Проверено 16 марта 2021 г. {{cite web}}: CS1 maint: bot: исходный статус URL неизвестен ( ссылка )
  7. ^ Корн, Дэвид Г .; Во, Кием-Фонг (1991). SFIO: безопасный/быстрый строковый/файловый ввод-вывод . Учеб. Летняя конференция USENIX. CiteSeerX   10.1.1.51.6574 .
  8. ^ Фаулер, Гленн С.; Корн, Дэвид Г.; Во, Кием-Фонг (2000). Расширенное форматирование с помощью Sfio . Учеб. Летняя конференция USENIX.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 84cccb48bdd5ef49e311a07a3d6257d9__1709145240
URL1:https://arc.ask3.ru/arc/aa/84/d9/84cccb48bdd5ef49e311a07a3d6257d9.html
Заголовок, (Title) документа по адресу, URL1:
C file input/output - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)