Програмиране на C/Стандартна библиотека/stdio.h

От Уикикниги
Направо към навигацията Направо към търсенето

Заглавния файл <stdio.h> декларира три типа, няколко макроса и множество функции за извършване на входно-изходни операции, като извеждане на информация на екрана, въвеждане на данни от клавиатура, записване/четене на данни в/от изходни/входни устройства и т.н.[1].

Описание[редактиране]

Потоци[редактиране]

В контекста на С всяко физическо устройство, което може да обменя данни с програмата (клавиатура, монитор, принтер, хард диск и др.) се нарича файл. Различните файловете се различават значително във физическата си имплементация и начин на работа, и съответно достъпа до тях се осъществява по различен начин. За да скрие тази разлика и да осигури унифициран интерфейс за достъп, езикът С изгражда едно абстрактно ниво между програмата и файла, наречено поток. Посредством това абстрактно ниво всички файлове от гледна точка на програмистта са еднакви, т.е за четене и/или записване във различни файлове се използват еднакви библиотечни функции. Казаното до тук може да се обобщи по следния начин: при обмяна на данни между програмата и файл, се създава поток, който скрива детайлите свързани с действителния начин на записване/четене на данни във/от файла.

Един поток се асоциира (свързва) с файл посредством функцията fopen() и се освобождава посредством функцията fclose().

Потоците могат да бъдат небуферирани, линейно буферирани, и напълно буферирани. При небуфериран поток данните се записват/четат във/от файла директно. При линейно буфериран поток данните се записват/четат в/от файла на редове. Един ред (линия) се състои от последователност от символи, завършваща със символ за нов ред. При напълно буфериран поток данните се записват/четат във/от файла при запълване на буфера. Функциите setbuf() и setvbuf() могат да се използват за управление на буферирането на потоците.

Файлове[редактиране]

Потоците се разделят на две категории: текстови и байтови потоци.

Текстовият поток се състои от редове. Всеки ред представлява нула или повече символи плюс символ за нов ред. Дали последния ред трябва да завършва със символ за нов ред зависи от имплеметацията. В зависимост от средата, в която се изпълнява програмата е възможно това, което програмата записва/чете да се различава от това, което в действителност е записано във файла. Например езикът С дефинира за край на ред символа '\n', докато в MS-DOS символът за край на ред е комбинация от символите '\r' и '\n', а в MAC OS само '\r'.

Двоичният поток представлява последователност от символи. Всички символи се разглеждат просто като байтове данни без да се интерпретират по някакъв специален начин. Това означава, че не се извършват никакви преобразувания и ще има пълно съответствие между съдържанието на един двоичен файл и прочетеното/записаното от програмата.

При стартиране на една програма, автоматично се създават 3 стандартни потока:

stdin
Това е стандартен поток за вход. В повечето системи този поток е свързан с клавиатурата. Стандартния входен поток stdin може да се използва за аргумент на всички входно-изходни функции, които изискват входен поток за аргумент, например fgetc(), fgets() и т.н. Повечето операционни системи поддържат пренасочване на стандартния входен поток при стартиране на приложението. Например MS-DOS/Windows и UNIX поддържат следния синтаксис при стартиране на приложението от командния ред:
C:\> myapplication<file.txt
Когато приложението myapplication се стартира, всички операции за четене от стандартния входен поток ще четат данни не от клавиатурата, а от файла file.txt.
Входния поток може да бъде пренасочен да използва друг източник на входни данни също и в програмата с помощта на функцията freopen().
По подразбиране входния поток stdin е напълно буфериран само ако е известно, че не сочи към интерактивно устройство. В противен случай буферирането е имплементационно-зависимо.
stdout
Това е стандартен поток за изход. В повечето системи този поток е свързан с монитор. Стандартния изходен поток stdout може да се използва за аргумент на всички входно-изходни функции, които изискват изходен поток за аргумент, например fputc(), fputs() и т.н. Повечето операционни системи поддържат пренасочване на стандартния изходен поток при стартиране на приложението. Например MS-DOS/Windows и UNIX поддържат следния синтаксис при стартиране на приложението от командния ред:
C:\> myapplication>file.txt
Когато приложението myapplication се стартира, всички операции за запис в стандартния изходен поток ще изпращат данни не към монитора, а към файла file.txt.
Изходния поток може да бъде пренасочен да изпраща данни към друго устройство също и в програмата с помощта на функцията freopen().
По подразбиране изходния поток stdout е напълно буфериран само ако е известно, че не сочи към интерактивно устройство. В противен случай буферирането е имплементационно-зависимо.
stdеrr
Това е стандартен поток за извеждане на грешки и предупреждения. В повечето системи този поток е свързан с монитор. Потокът stderr може да се използва за аргумент на всички входно-изходни функции, които изискват изходен поток за аргумент, например fputc(), fputs() и т.н. Повечето операционни системи поддържат пренасочване на потока stderr при стартиране на приложението. Например MS- DOS/Windows и UNIX поддържат следния синтаксис при стартиране на приложението от командния ред:
C:\> myapplication 2> file.txt
Потокa stderr може да бъде пренасочен да изпраща съобщения към друго устройство също и в програмата с помощта на функцията freopen().
При стартиране на програмата stderr никога не е напълно буфериран. Дали ще бъде линейно буфериран или небуфериран е имплементационно-зависимо.

Типове[редактиране]

size_t
Имплементационно-дефиниран беззнаков целочислен тип (най-често unsigned long), който е тип на резултата на оператора sizeof.[2]Този тип е дефиниран също и в <stddef.h>.
FILE
FILE е тип на обект, който съдържа цялата необходима информация за управление на входно-изходен поток. Това включва указател към буфер на поток, индикатор на позицията във файл, флагове за грешки, указващи дали са възникнали грешки при четене/записване и флаг за край на файл, указващ дали е достигнат края на файл.
fpos_t
Типът fpos_t е типа на обекта, който се връща от функцията fgetpos(). Този обект съдържа цялата информация, необходима за специфицирането на всяка позиция в един файл.

Макроси[редактиране]

Макрос Предназначение
NULL Макросът NULL се използва за обозначаване на нулев константен указател. Указатели, които съдържат тази стойност се приема, че не сочат към нищо. Стойността на NULL е имплементационно-зависима. Повечето имплементации дефинират NULL като 0 или ((void*)0).
Макросът NULL е дефиниран за по-голямо удобство също и в заглавните файлове <stdio.h>, <locale.h>, <stdlib.h>, <string.h>, <time.h> и <wchar.h>.
_IOFBF
_IOLBF
_IONBF
Тези макроси се разширяват до целочислени константни изрази с различни стойности, подходящи за използване като трети аргумент на функцията setvbuf();
BUFSIZ Цяло число, което представлява размера на буфера, използван от функцията setvbuf().
EOF Отрицателно цяло число, указващо че края на файла е достигнат.
FOPEN_MAX Цяло число, което указва минималния брой файлове, които системата гарантира, че могат да бъдат отворени едновременно.
FILENAME_MAX Цяло число, което указва най-голямата дължина на масив от символи, подходящ за съхранение на най-дългото възможно име на файл, който може да се отвори с функцията fopen(). Ако имплементацията не налага ограничение върху дължината на име на файл, препоръчително е тази стойност да се използва като максимална.
L_tmpnam Цяло число, което указва най-голямата дължина на масив от символи, подходящ за съхранение на най-дългото възможно временно име на файл, генерирано от функцията tmpname().
SEEK_CUR
SEEK_END
SEEK_SET
Тези макроси се разширяват до целочислени константни изрази с различни стойности, подходящи за използване като трети аргумент на функцията fseek().
TMP_MAX Цяло число, указващо максималния брой на уникалните имена на файлове, които функцията tmpnam() може да генерира.
stderr
stdin
stdout
Това са стандартни потоци за вход-изход. Те представляват указатели към обекти тип FILE, които сочат към FILE обекти, асоциирани съответно със стандартен поток за грешка, стандартен поток за вход и стандартен поток за изход.

Макро-функции[редактиране]

C2x § 7.21 Input/output <stdio.h>[1]

За операции върху файлове[редактиране]

C2x § 7.21.4 Operations on files[3]

remove[редактиране]

C2x § 7.21.4.1 The remove function[4]
#include <stdio.h>
int remove(const char *filename);
Описание
Функцията remove изтрива файла, указан с filename. Ако файлът е отворен, поведението е имплементационно-зависимо.

Вижте също: rename

Резултат
Израза от вида remove(filename) връща като резултат 0 при успешно изпълнение, в противен случай връща ненулева стойност.

rename[редактиране]

C2x § 7.21.4.2 The rename function[5]
#include <stdio.h>
int rename(const char *old, const char *new);
Описание
Функцията rename преименува файла, указан с old, с името, указано с new. Ако вече съществува файл със същото име като това зададено с new поведението е имплементационно-зависимо.

Вижте също:

Резултат
Израза от вида rename(old, new) връща като резултат 0 при успешно изпълнение, в противен случай връща ненулева стойност и името на файла остава непроменено.

tmpfile[редактиране]

C2x § 7.21.4.3 The tmpfile function[6]
#include <stdio.h>
FILE *tmpfile(void);
Описание
Функцията tmpfile създава временен файл с режим на достъп wb+. Файла автоматично се изтрива при неговото затваряне или при завършване на програмата. Ако програмата завърши аварийно, дали файла ще бъде изтрит зависи от имплементацията.

Вижте също: tmpnam и tmpnam_s

Резултат
Израза от вида rename(old, new) връща като резултат указател към асоциирания с файла поток. Ако файлът не може да бъде създаден tmpfile() връща нулев указател.

tmpnam[редактиране]

C2x § 7.21.4.4 The tmpnam function[7]
#include <stdio.h>
char *tmpnam(char *s);
Описание
Функцията tmpnam генерира уникални имена подходящи за използване за имена на временни файлове (файлове създадени ръчно, а не с tmpnam()). Функцията генерира различни имена при всяко свое извикване до TMP_MAX пъти. Ако се извика над този брой, поведението е имплементационно-зависимо.

Вижте също: tmpfile и tmpfile_s

Резултат
Ако s е нулев указател, генерираното име се съхранява в статичен буфер, дефиниран в самата функция и се връща указател към него. Ако s е валиден буфер, генерираното име се записва в него и tmpnam() връща аргумента като резултат. Размерът на подадения буфер трябва да е поне L_tmpnam символа.

За достъп до файл[редактиране]

C2x § 7.21.5 File access functions[8]

fclose[редактиране]

C2x § 7.21.5.1 The fclose function[9]
#include <stdio.h>
char *tmpnam(char *s);
Описание
Функцията fclose затваря файла, асоцииран с потока указан с s. Ако файлът е отворен за записване, съдържанието на буфера се записва във файла преди той да бъде затворен. А ако е отворен за четене, свързания с него буфер се изчиства.

Вижте също: fopen, fopen_s, freopen и freopen_s

Резултат
Израза от вида fclose(s) връща като резултат 0 при успешно затваряне на файла, или EOF при възникване на грешка по време на затваряне.

fflush[редактиране]

C2x § 7.21.5.2 The fflush function[10]
#include <stdio.h>
int fflush(FILE *stream);
Описание
Функцията fflush изчиства буфера на потока, указан с stream. Това означава, че ако потокът е отворен за записване (или записване-четене, като последната операция е била записване), съдържанието на буфера се записва във файла, асоцииран с потока. В другите режими поведението е недефинирано. Ако за аргумент на stream се използва нулев указател, буферите на всички отворени потоци се изчистват по описания по-горе начин.

Вижте също: fopen и freopen

Резултат
Израза от вида fflush(stream) връща като резултат 0 при успешно изпълнение, или EOF при възникване на грешка по време на записване.

fopen[редактиране]

C2x § 7.21.5.3 The fopen function[11]
#include <stdio.h>
FILE *fopen(const char * restrict filename, const char * restrict mode);
Описание
Функцията fopen отваря поток и го асоциира с файла, указан от filename. Режимът на достъп до файла се указва с mode. Параметърът mode може да приема един от следните аргументи:
  • "r" – Отваряне на текстов файл за четене.
  • "w" – Отваряне на текстов файл записване. Ако файлът съществува, записването започва от началото на файла (предварително се изтрива старото съдържание на файла). Ако файлът не съществува, ще бъде създаден.
  • "a" – Отваряне на текстов файл за записване. Ако файлът съществува, текстът ще бъде дописан в края на файла. Ако файлът не съществува, ще бъде създаден.
  • "rb" – Отваряне на двоичен файл за четене.
  • "wb" – Отваряне на двоичен файл за записване. Ако файлът съществува, записването ще започне от началото на файла, а старото съдържание ще бъде изтрито. Ако файлът не съществува, ще бъде създаден.
  • "ab" – Отваряне на двоичен файл за записване. Ако файлът съществува, данните ще бъдат добавени в края на файла. Ако файлът не съществува, ще бъде създаден.
  • "r+" – Отваряне на текстов файл за четен и записване.
  • "w+" – Създаване на текстов файл за четен и записване. Ако файлът съществува, съдържанието му ще бъде изтрито. Ако файлът не съществува, ще бъде създаден.
  • "a+" – Отваряне на текстов файл за четене и записване. Ако файлът съществува, записването се изпълнява от края на файла. Ако файлът не съществува, ще бъде създаден.
  • "rb+" или "r+b" – Отваряне на двоичен файл за четене и записване.
  • "wb+" или "w+b" – Отваряне на двоичен файл за четене и записване. Ако файлът съществува, съдържанието му ще бъде изтрито. Ако файлът не съществува, ще бъде създаден.
  • "ab+" или "a+b" – Отваряне на двоичен файл за четене и записване. Ако файлът съществува, записването се изпълнява от края на файла. Ако файлът не съществува, ще бъде създаден.

При отваряне един поток е напълно буфериран само ако може да се определи, че той не сочи към интерактивно устройство. Флаговете за грешка и край на файл се нулират.

Вижте също: fopen и freopen

Резултат
Израза от вида fopen(filename, mode) връща като резултат указател към стойност от тип FILE, който управлява потока. При възникване на грешка връща нулев указател.

freopen[редактиране]

C2x § 7.21.5.4 The freopen function[12]
#include <stdio.h>
FILE *freopen(const char * restrict filename, const char * restrict mode, FILE * restrict stream);
Описание
Функцията freopen затваря файла, асоцииран с потока stream и асоциира потока с файла, указан с filename. Режимът на достъп до новия файл се определя от параметъра mode.

Вижте също: fopen и fclose

Резултат
Израза от вида freopen(filename, mode, stream) връща като резултат потока stream при успешно изпълнение, в противен случай нулев указател.

setbuf[редактиране]

C2x § 7.21.5.5 The setbuf function[13]
#include <stdio.h>
void setbuf(FILE * restrict stream, char * restrict buf);
Описание
Функцията setbuf определя как потока stream се буферира. Тази функция трябва да се извика след като потока е бил асоцииран с отворен файл и преди всякакви други операции с него. Аргумента buf, сочи към буфера, който ще се използва от потока.

За размер на буфера (в байтове) трябва да се използва макроса BUFSIZ. Ако buf е нулев указател потокът е небуфериран.

Вижте също: setvbuf

Резултат
Израза от вида setbuf(stream, buf) не връща резултат.

setvbuf[редактиране]

C2x § 7.21.5.6 The setvbuf function[14]
#include <stdio.h>
int setvbuf(FILE * restrict stream, char * restrict buf, int mode, size_t size);
Описание
Функцията setvbuf определя как потока stream се буферира. Тази функция трябва да се извика след като потока е бил асоцииран с отворен файл и преди всякакви други операции с него. Параметърът mode определя режима на буфериране и може да приеме следните аргументи:
  • _IOFBF
Потокът е напълно буфериран. При операция записване, данните първо се записват в буфера. След като буфера се напълни неговото съдържание се записва във файла и буфера се изчиства. При операция четене буфера се запълва изцяло преди данните да се подадат към програмата.
  • _IOLBF
Потокът е линейно буфериран. При операция записване данните първо се записват в буфера. Съдържанието на буфера се записва във файла и буфера се изчиства при следните условия:
1. При поява на символ за нов ред;
2. При запълване на буфера.
При четене от файла буферът се пълни до появата на символ за нов ред преди данните да се подадат към програмата.
  • _IONBF
Потокът е небуфериран. Операциите записване/четене в/от файла се осъществяват директно. В този случай параметрите buf и size се игнорират.

Ако buf е нулев указател, setvbuf() използва функцията malloc(), за да задели памет за буфера с размер size.

Вижте също: setbuf

Резултат
Израза от вида setvbuf(stream, buf, size) връща като резултат 0 при успешно изпълнение. Всяка друга стойност е индикация за грешка или невалиден аргумент на аргумента mode.

За форматиран вход-изход[редактиране]

C2x § 7.21.6 Formatted input/output functions[15]

fprintf[редактиране]

C2x § 7.21.6.1 The fprintf function[16]
#include <stdio.h>
int fprintf(FILE * restrict stream, const char * restrict format, ...);
Описание
Функцията fprintf изпраща форматиращ низ, указан с format, към изходния поток stream. Допълнително функцията приема променлив брой аргументи, които се изпращат към потока на мястото на така наречените форматни спецификатори, които са част от форматиращия низ. Форматните спецификартори указват начина, по който съответните аргументи се преобразуват в низове преди да се изпратят към потока. Всички символи от форматиращия низ, които не са част от форматен спецификатор или не са escape-последователности (например \n) се изпращат към потока без промяна. На всеки форматен спецификатор трябва да съответства аргумент от списъка с променлив брой аргументи. На първия форматен спецификатор (от ляво на дясно във форматиращия низ) отговаря първия аргумент от списъка с променлив брой аргументи и т.н. Изключение е само форматния спецификатор %%, който не изисква аргумент. Ако броят на аргументите е по-малък от броя на форматните спецификатори, изискващи аргумент, поведението е недефинирано. Ако броят на аргументите е по-голям от броя на форматните спецификатори, изискващи аргумент, излишните аргументи се изчисляват, но се игнорират.

Един форматен спецификатор има следния формат:

%[флагове][ширина][.прецизност][модификатор]спецификатор

Както се вижда, един форматен спецификатор започва със знак %, последван от четири полета по избор (квадратните скоби указват, че тези полета не са задължителни) и задължително поле спецификатор. Значението на всяко от полетата е показано в отделни таблици:

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

Това поле определя типа на аргумента, който се преобразува в низов еквивалент.

  • d, i signed int
Аргумента се преобразува в знаков десетичен низов еквивалент от вида [-]ddd---d, където d е десетична цифра 0÷9. Например -10 се преобразува в низа "-10".
  • o, u, x (или X) unsigned int
Аргумента се преобразува в безнаков осмичен, десетичен или шестнадесетичен низов еквивалент от вида dd---d, където d е съответно осмична цифра 0÷7, десетична цифра 0÷9 или шестнадесетична цифра 0÷9 и а÷f (или A÷F). Например 10 се преобразува в низа "12(8)", "10(10)", (16)" или "A(16)".
  • f double
Аргумента се преобразува в десетичен низов еквивалент от вида [-]dd---d.dd---d, където d е десетична цифра 0÷9. Например -12.543 се преобразува в низа "-12,543000"1.[17]
  • e (или E) double
Аргумента се преобразува в десетичен низов еквивалент от вида [-]d.dd---de±dd или [-]d.dd---dЕ±dd, където d е десетична цифра 0÷9. Например -12.543 се преобразува в низа "-1.254300e+001"1.[17]
  • g (или G) double
Аргумента се преобразува в десетичен низов еквивалент както спецификатора f или e (или Е), т.е. [-]dd---d.dd---d или [-]d.dd---de±dd (или [-]d.dd---dЕ±dd). Ако експонентата е по-малка от -4 или равна или по-голяма от зададената прецизност се използва спецификатор e (или E), иначе се използва спецификатор f. Допълващите нули се премахват. Десетичната точка се отпечатва само ако има ненулева десетична цифра. Например -1.254е-6 се преобразува в низа "-1.254е-006", а -1.254е-3 се преобразува в низа "-0.001254".
  • c char
Аргумента се преобразува в еквивалентен символ тип unsigned char. Например 100 се преобразува в 'а' при използване на ASCII кодовата таблица.
  • s char*
Този спецификатор указва, че съответния аргумент е низ. Нулевия символ не се изпраща в потока.
  • p тип*
Аргумента е указател, чиято стойност се преобразува в последователност от символи. Например ако указателя ptr съдържа адрес 5DC8, той ще се преобразува в низа "5DC8".
  • n int*
Аргумента е указател към цяло число, в което се записват броя на символите записани до тук в потока stream от това извикване на fprint(). Няма преобразуване на аргумента.
  • %
Символът % се изпраща в потока. Този спецификатор не изисква аргумент.

модификатор

Това поле до определя типа на аргумента, който се преобразува в низов еквивалент.

  • h
d, i, o, u, x (или X)
Указва че аргумента е тип short int или unsigned short int.
n
Указва, че аргумента е указател към short int.
  • l
d, i, o, u, x (или X)
Указва че аргумента е от тип long int или unsigend long int.
c
Указва, че аргумента е тип wchar_t (добавено от ISO/IEC 9899:1990/Amd 1:1995).
s
Указва, че аргумента е тип wchar_t* (добавено от ISO/IEC 9899:1990/Amd 1:1995).
n
Указва, че аргумента е указател към long int.
  • L
e (или E), f, g (или G)
Указва, че аргумента е от тип long double.

прецизност

Определя прецизността на преобразуване на аргумента. За спецификаторите d, i, o, u, x (или X) определя минималния брой цифри, които да се преобразуват в низов еквивалент. За спецификаторите f, e (или E) определя максималния брой цифри след десетичната точка, които да се преобразуват в низов еквивалент. За спецификаторите g (или G) определя максималния брой значещи цифри, които да се преобразуват в низов еквивалент. За спецификатора s определя максималния брой символи, които да се изпратят към потока.

Това поле започва с точка (.), последвана от десетично число или *. Ако се използва *, прецизността се определя от следващия аргумент (който трябва да е тип int) от списъка с променлив брой аргументи.

d, i, o, u, x (или X)
Минимум 1 цифра се преобразува. Ако аргумента съдържа повече от 1 цифра всички те ще се преобразуват.
f, e (или E)
Максимум 6 цифри след десетичната точка се преобразуват. Ако аргумента има повече от 6 цифри след десетичната точка, само 6 от тях ще се преобразуват.
g (или G)
Всички значещи цифри се преобразуват.
  • . или .0
d, i, o, u, x (или X)
Използва подразбиращата се прецизност. Ако стойността на аргумента е нула той не се преобразува.
f, e (или E)
Символите след десетичната точка се игнорират.
g (или G)
Приема се прецизност 1.
  • .N
d, i, o, u, x (или X)
Поне *N на брой цифри се преобразуват. Ако *N е по-голямо от броя на цифрите в аргумента празните позиции се уплътняват с нули.
f, e (или E)
N на брой цифри след десетичната точка ще се преобразуват. Ако N е по-голямо от броя на цифрите след десетичната точка, ще бъдат добавени нули, така че броят на десетичните цифри и добавените след тях нули да е равна на N.
g (или G)
N на брой значещи цифри ще бъдат преобразувани.

ширина

Широчината на полето се задава с десетично цяло число или * и определя минималния брой позиции, в които аргумента да се преобразува. Ако аргументът съдържа по-голям брой цифри от зададената ширина, тя се игнорира. Ако аргументът съдържа по-малък брой цифри от зададената ширина, празните позиции се уплътняват с интервали. Ако широчината на полето е зададена с *, то следващия аргумент (който трябва да е тип int), от списъка с променлив брой аргументи, определя широчината на полето.

флагове

Един или повече флагове (във произволен ред) със следното значение:
  • всички
Ляво подравняване (по подразбиране се използва дясно подравняване). Ако се използва в комбинация с флаг 0, флаг 0 се игнорира.
  • + всички
Положителните числа се предхождат от знак +. Ако се използва в комбинация с флаг интервал, флаг интервал се игнорира.
  • интервал всички
Добавя интервал пред положителните числа. Ако се използва в комбинация с флаг +, флаг интервал се игнорира.
  • #
о
Добавя водеща 0 пред резултата.
x (или X)
Добавя 0x или 0X пред резултата.
Е, е, f, g, G
Десетичната точка винаги се добавя в резултата.
g (или G)
Допълващите нули в резултата не се премахват.
  • 0
d, i, o, u, x, X, e, E, f, g, и G
Водещи нули се използват да уплътнят ширината на полето вместо интервали. Ако се използва в комбинация с флаг , флага 0 се игнорира.
d, i, o, u, x, X
Ако е зададена прецизност, флага 0 се игнорира.

Вижте също: fwprintf, vfprintf, fputs и fscanf

Резултат
Израза от вида fprintf(stream, format) връща като резултат броя на символите записани в потока при успешно изпълнение, в противен случай връща отрицателна стойност.

printf[редактиране]

C2x § 7.21.6.3 The printf function[18]
#include <stdio.h>
int printf(const char * restrict format, ...);
Описание
Функцията printf е еквивалентна на fprintf() с първи аргумент stdout, т.е. форматирания низ по подразбиране се изпраща към стандартния изходен поток stdout.

Вижте също: wprintf и vprintf

Резултат
Израза от вида printf(format) връща като резултат броя на символите записани в потока при успешно изпълнение, в противен случай връща отрицателна стойност.

scanf[редактиране]

C2x § 7.21.6.4 The scanf function[19]
#include <stdio.h>
int scanf(const char * restrict format, ...);
Описание
Функцията scanf е същата като fscanf() с първи аргумент stdin, т.е. входния поток е стандартния входен поток stdin.

Вижте също: scanf и sscanf

Резултат
Израза от вида scanf(format) връща като резултат EOF ако е възникнала грешка при четенето (input failure) или е достигнат края на файла, преди първото преобразуване. В противен случай връща броя на успешно съхранените в аргументите символни последователности, който може да е по малък от броя на аргументите или дори 0 (поради matching failure).

За неформатиран вход-изход[редактиране]

C2x § 7.21.7 Character input/output functions[20]

fgetc[редактиране]

C2x § 7.21.7.1 The fgetc function[21]
#include <stdio.h>
int fgetc(FILE *stream);
Описание
Функцията fgetc чете поредния символ (unsigned char) от потока stream и премества индикатора на позицията към следващия символ.

Вижте също: getchar, gets, fputc, putc и ungetc

Резултат
Израза от вида fgetc(stream) връща като резултат символа при успешно изпълнение. Ако е достигнат края на файла, fgetc() връща EOF и вдига флага за край на файла. Ако възникне грешка fgetc() връща EOF и вдига флага за грешка на потока.

fgets[редактиране]

C2x § 7.21.7.2 The fgets function[22]
#include <stdio.h>
char *fgets(char * restrict s, int n, FILE * restrict stream);
Описание
Функцията fgets чете символи от потока stream и ги съхранява в буфера s. Четенето и записването на символи в буфера спира при появата на едно от следните условия:
  • При прочитане на n-1 на брой символа;
  • При прочитане на символ за нов ред преди броят на прочетените символи да е достигнал n-1. Символа за нов ред също се копира в буфера;
  • При достигане края на файла.

Нулевия символ '\0' автоматично се добавя в края на съхранените в буфера символи.

Вижте също: scanf, fcanf, sscanf, gets и fputs

Резултат
Израза от вида fgets(s, n, stream) връща като резултат s при успешно изпълнение и нулев указател, ако файлът е празен или възникне грешка при четенето.

fputc[редактиране]

C2x § 7.21.7.3 The fputc function[23]
#include <stdio.h>
int fputc(int c, FILE *stream);
Описание
Функцията fputc записва символа c (преобразуван в тип unsigned char) във файла, асоцииран с потока stream, в текущата позиция, указвана от индикатора на позицията и премества индикатора към следващата позиция.

Вижте също: putchar

Резултат
Израза от вида fputc(c, stream) връща като резултат записания символ при успешно изпълнение и EOF при възникване на грешка.

За директен вход-изход[редактиране]

C2x § 7.21.8 Direct input/output functions[24]

fread[редактиране]

C2x § 7.21.8.1 The fread function[25]
#include <stdio.h>
size_t fread(void * restrict ptr, size_t size, size_t nmemb,
FILE * restrict stream)
Описание
Функцията fread чете nmemb на брой обекта[26], всеки с размер size (в байтове), от файл, асоцииран с потока stream, и ги съхранява в буфера, указан с ptr. Индикаторът на текущата позицията на файла се увеличава с броя на успешно прочетените байтове. Ако възникне грешка стойността на индикатора на текущата позиция е неопределена. Ако един обект се прочете частично стойността на индикатора на текущата позиция е неопределена.

Вижте също: scanf, fscan, sscanf, fgets и fwrite

Резултат
Израза от вида fread(ptr, size, nmemb, stream) връща като резултат броя на успешно прочетените елементи, който може да е по-малък от nmemb, ако възникне грешка при четенето или се достигне края на файла. За да се определи кое от двете е вярно може да се използват функциите feof() и ferror(). Ако size или nmemb е 0, fread() връща 0.

fwrite[редактиране]

C2x § 7.21.8.2 The fwrite function[27]
Описание
Функцията fwrite записва nmemb на брой обекта[26], всеки с размер size (в байтове), сочени от буфера ptr, във файла, асоцииран с потока stream. Индикаторът на текущата позицията на файла се увеличава с броя на успешно записаните байтове. Ако възникне грешка стойността на индикатора на текущата позиция е неопределена.

Вижте също: printf, fprintf, sprintf, snprintf, fputs и fread

Резултат
Израза от вида fwrite(ptr, size, nmemb, stream) връща като резултат броя на успешно записаните елементи, който може да е по-малък от nmemb, ако възникне грешка при записване.

За позициониране във файл[редактиране]

C2x § 7.21.9 File positioning functions[28]

fgetpos[редактиране]

C2x § 7.21.9.1 The fgetpos function[29]
#include <stdio.h>
int fgetpos(FILE * restrict stream, fpos_t * restrict pos);
Описание
Функцията fgetpos съхранява стойността на индикатора на текущата позиция във файла, асоцииран с потока stream, в обекта, сочен от указателя pos.

Вижте също: ftell, fseek и fsetpos

Резултат
Израза от вида fgetpos(stream, pos) връща като резултат 0 при успешно изпълнение. При възникване на грешка връща ненулева стойност и записва имплементационно-зависима положителна стойност в променливата errno.

fseek[редактиране]

C2x § 7.21.9.2 The fseek function[30]
#include <stdio.h>
int fseek(FILE *stream, long int offset, int whence);
Описание
Функцията fseek премества индикатора на позицията на файла, асоцииран с потока stream, с offset на брой байта, относно позицията, указана с whence. Параметърът whence приема един от следните аргументи:
  • SEEK_SET
Указва, че индикаторът на позицията трябва да се премести с offset на брой байта от началото на файла.
  • SEEK_CUR
Указва, че индикаторът на позицията трябва да се премести с offset на брой байта от текущата позиция във файла.
  • SEEK_END
Указва, че индикаторът на позицията трябва да се премести с offset на брой байта от края на файла.

Ако потокът stream е асоцииран с текстов файл, стойността на параметъра whence трябва да бъде SEEK_SET, а стойността на параметъра offset трябва да бъде 0 или тази върната от по-ранно извикване на функцията ftell() върху същия поток.

Вижте също: fgetpos, fseek и fsetpos

Резултат
Израза от вида fseek(stream, offset, whence) връща като резултат 0 при успех, в противен случай връща ненулева стойност.

fsetpos[редактиране]

C2x § 7.21.9.3 The fsetpos function[31]
#include <stdio.h>
int fsetpos(FILE *stream, const fpos_t *pos);
Описание
Функцията fsetpos съхранява стойността на индикатора на текущата позиция във файла, асоцииран с потока stream, в обекта, сочен от указателя pos.

Вижте също: ftell, fseek и fsetpos

Резултат
Израза от вида fsetpos(stream, pos) връща като резултат 0 при успешно изпълнение. При възникване на грешка връща ненулева стойност и записва имплементационно-зависима положителна стойност в променливата errno.

ftell[редактиране]

C2x § 7.21.9.4 The ftell function[32]
#include <stdio.h>
long int ftell(FILE *stream);
Описание
Функцията ftell връща стойността на индикатора на позицията на файла асоцииран с потока stream. За двоични потоци тази стойност е броя на байтовете от началото на файла. За текстови потоци, резултата от тази функция не е специфициран, но може да се използва от функцията fseek(), за да възстанови позицията на индикатора.

Вижте също: fgetpos, fseek и fsetpos

Резултат
Израза от вида ftell(stream) връща като резултат -1L при неуспех и съхранява имплементационно-зависима положителна стойност в променливата errno.

rewind[редактиране]

C2x § 7.21.9.5 The rewind function[33]
#include <stdio.h>
void rewind(FILE *stream);
Описание
Функцията rewind премества индикатора на позицията на файла, асоцииран с потока stream, в началото на файла. Поведението е еквивалентно на извикване на функцията fseek() със следните аргументи

(void)fseek(stream, 0L, SEEK_SET)

с разликата, че флага за грешка на потока също се нулира.

Вижте също: fseek

Резултат
Израза от вида rewind(stream) не връща резултат.

За обработка на грешки[редактиране]

C2x § 7.21.10 Error-handling functions[34]

clearerr[редактиране]

C2x § 7.21.10.1 The clearerr function[35]
#include <stdio.h>
void clearerr(FILE *stream);
Описание
Функцията clearerr изчиства флага за край на файл и флага за грешка, свързани с потока указан с stream.

При успешно отваряне на файл с fopen() всички флагове за грешки на потока се нулират. При работа с файлове грешки могат да възникнат по различни причини. Функцията perror() може да се използва за получаване на информация за грешката.

Вижте също: feof, perror и ferror

Резултат
Израза от вида clearerr(stream) не връща резултат.

feof[редактиране]

C2x § 7.21.10.2 The feof function[36]
#include <stdio.h>
int feof(FILE *stream);
Описание
Функцията feof проверява флага за край на файл на потока, указан с stream.

Вижте също: clearerr, perror и ferror

Резултат
Израза от вида feof(stream) връща като резултат ненулева стойност, ако потокът е достигнал края на файла, в противен случай връща 0.

ferror[редактиране]

C2x § 7.21.10.3 The ferror function[37]
#include <stdio.h>
int ferror(FILE *stream);
Описание
Функцията ferror проверява флагът за грешка на потока, указан с stream. При всяка операция за четене или записване от/във файла, свързан с потока, флага за грешка се вдига ако възникне грешка. Ако операцията завърши без грешка, флага се нулира. Подробна информация за възникналата грешка може да се получи чрез функцията perror().

Вижте също: clearerr и feof

Резултат
Израза от вида ferror(stream) връща като резултат ненулева стойност, ако флага за грешка е вдигнат, в противен случай връща 0.

perror[редактиране]

C2x § 7.21.10.4 The perror function[38]
#include <stdio.h>
void perror(const char *s);
Описание
Функцията perror проверява флагът за грешка на потока, указан с stream. При всяка операция за четене или запис от/във файла, свързан с потока, флага за грешка се вдига ако възникне грешка. Ако операцията завърши без грешка, флага се нулира. Подробна информация за възникналата грешка може да се получи чрез функцията perror().

Вижте също: strerror

Резултат
Израза от вида perror(s) връща като резултат ненулева стойност, ако флага за грешка е вдигнат, в противен случай връща 0.

Бележки[редактиране]

  1. 1,0 1,1 Script error: The module returned a nil value. It is supposed to return an export table.. ISO/IEC JTC1/SC22/WG14. p. 265, § 7.21 Input/output <stdio.h>. (на английски)
  2. Script error: The module returned a nil value. It is supposed to return an export table.. ISO/IEC. с. 260, § 7.19 Common definitions <stddef.h>.
  3. "ISO/IEC 9899:202x" с. 269 § 7.21.4 Operations on files
  4. "ISO/IEC 9899:202x" с. 269 § 7.21.4.1 The remove function
  5. "ISO/IEC 9899:202x" с. 269 § 7.21.4.2 The rename function
  6. "ISO/IEC 9899:202x" с. 270 § 7.21.4.3 The tmpfile function
  7. "ISO/IEC 9899:202x" с. 270 § 7.21.4.4 The tmpnam function
  8. "ISO/IEC 9899:202x" с. 271 § 7.21.5 File access functions
  9. "ISO/IEC 9899:202x" с. 271 § 7.21.5.1 The fclose function
  10. "ISO/IEC 9899:202x" с. 271 § 7.21.5.2 The fflush function
  11. "ISO/IEC 9899:202x" с. 271 § 7.21.5.3 The fopen function
  12. "ISO/IEC 9899:202x" с. 272 § 7.21.5.4 The freopen function
  13. "ISO/IEC 9899:202x" с. 273 § 7.21.5.5 The setbuf function
  14. "ISO/IEC 9899:202x" с. 273 § 7.21.5.6 The setvbuf function
  15. "ISO/IEC 9899:202x" с. 274 § 7.21.6 Formatted input/output functions
  16. "ISO/IEC 9899:202x" с. 274 § 7.21.6.1 The fprintf function
  17. 17,0 17,1 Броят на цифрите след десетичната точка се определя от полето прецизност. По подразбиране се използват 6 цифри.
  18. "ISO/IEC 9899:202x" с. 287 § 7.21.6.3 The printf function
  19. "ISO/IEC 9899:202x" с. 287 § 7.21.6.4 The scanf function
  20. "ISO/IEC 9899:202x" с. 291 § 7.21.7 Character input/output functions
  21. "ISO/IEC 9899:202x" с. 291 § 7.21.7.1 The fgetc function
  22. "ISO/IEC 9899:202x" с. 291 § 7.21.7.2 The fgets function
  23. "ISO/IEC 9899:202x" с. 291 § 7.21.7.3 The fputc function
  24. "ISO/IEC 9899:202x" с. 296 § 7.21.8 Direct input/output functions
  25. "ISO/IEC 9899:202x" с. 294 § 7.21.8.1 The fread function
  26. 26,0 26,1 Обект може да бъде както от базов тип (char, int, double и т.н.), така и от потребителски тип, например структура.
  27. "ISO/IEC 9899:202x" с. 295 § 7.21.8.2 The fwrite function
  28. "ISO/IEC 9899:202x" с. 295 § 7.21.9 File positioning functions
  29. "ISO/IEC 9899:202x" с. 295 § 7.21.9.1 The fgetpos function
  30. "ISO/IEC 9899:202x" с. 296 § 7.21.9.2 The fseek function
  31. "ISO/IEC 9899:202x" с. 296 § 7.21.9.3 The fsetpos function
  32. "ISO/IEC 9899:202x" с. 296 § 7.21.9.4 The ftell function
  33. "ISO/IEC 9899:202x" с. 297 § 7.21.9.5 The rewind function
  34. "ISO/IEC 9899:202x" с. 297 § 7.21.10 Error-handling functions
  35. "ISO/IEC 9899:202x" с. 297 § 7.21.10.1 The clearerr function
  36. "ISO/IEC 9899:202x" с. 297 § 7.21.10.2 The feof function
  37. "ISO/IEC 9899:202x" с. 298 § 7.21.10.3 The ferror function
  38. "ISO/IEC 9899:202x" с. 298 § 7.21.10.4 The perror function