Бьерн Страуструп. Язык программирования С++ Второе дополненное издание



Pdf көрінісі
бет200/256
Дата11.07.2022
өлшемі2,87 Mb.
#37591
1   ...   196   197   198   199   200   201   202   203   ...   256
Байланысты:
Бьерн Страуструп. Язык программирования С . М Бином, 2011

10.6 Ввод-вывод в С 
Поскольку текст программ на С и на С++ часто путают, то путают иногда и потоковый ввод-вывод С++ и 
функции ввода-вывода семейства printf для языка С. Далее, т.к. С-функции можно вызывать из 
программы на С++, то многие предпочитают использовать более знакомые функции ввода-вывода С. 
По этой причине здесь будет дана основа функций ввода-вывода С. Обычно операции ввода-вывода на 
С и на С++ могут идти по очереди на уровне строк. Перемешивание их на уровне посимвольного ввода-
вывода возможно для некоторых реализаций, но такая программа может быть непереносимой. 
Некоторые реализации потоковой библиотеки С++ при допущении ввода-вывода на С требуют вызова 
статической функции-члена ios::sync_with_stdio(). 
В общем, потоковые функции вывода имеют перед стандартной функцией С printf() то преимущество, 
что потоковые функции обладают определенной типовой надежностью и единообразно определяют 


Бьерн Страуструп.
Язык программирования С++ 
 
280 
вывод объектов предопределенного и пользовательского типов. 
Основная функция вывода С есть 
int printf(const char* format, ...) 
и она выводит произвольную последовательность параметров в формате, задаваемом строкой 
форматирования format. Строка форматирования состоит из объектов двух типов: простые символы, 
которые просто копируются в выходной поток, и спецификации преобразований, каждая из которых 
преобразует и печатает очередной параметр. Каждая спецификация преобразования начинается с 
символа %, например 
printf("there were %d members present.",no_of_members); 
Здесь %d указывает, что no_of_members следует считать целым и печатать как соответствующую 
последовательность десятичных цифр. Если no_of_members==127, то будет напечатано 
there were 127 members present. 
Набор спецификаций преобразований достаточно большой и обеспечивает большую гибкость печати. 
За символом % может следовать: 

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

необязательная строка цифр, задающая ширину поля; если в преобразованном значении меньше 
символов, чем ширина строки, то оно дополнится до ширины поля пробелами слева (или справа, 
если дана спецификация выравнивания влево); если строка ширины поля начинается с нуля, то 
дополнение будет проводится нулями, а не пробелами; 

необязательный символ точка служит для отделения ширины поля от последующей строки цифр; 

необязательная строка цифр, задающая точность, которая определяет число цифр после 
десятичной точки для значений в спецификациях e или f, или же задает максимальное число 
печатаемых символов строки; 

для задания ширины поля или точности может использоваться * вместо строки цифр. В этом 
случае должен быть параметр целого типа, который содержит значение ширины поля или 
точности; 

необязательный символ h указывает, что последующая спецификация d, o, x или u относится к 
параметру типа короткое целое; 

необязательный символ l указывает, что последующая спецификация d, o, x или u относится к 
параметру типа длинное целое; 
% обозначает, что нужно напечатать сам символ %; параметр не нужен; 

символ, указывающий тип требуемого преобразования. Символы преобразования и их смысл 
следующие: 
d Целый параметр выдается в десятичной записи; 
o Целый параметр выдается в восьмеричной записи; 
x Целый параметр выдается в шестнадцатеричной записи; 
f Вещественный или с двойной точностью параметр выдается в десятичной записи вида [-
]ddd.ddd, где число цифр после точки равно спецификации точности для параметра. Если 
точность не задана, печатается шесть цифр; если явно задана точность 0, точка и цифры после 
нее не печатаются; 
e Вещественный или с двойной точностью параметр выдается в десятичной записи вида [-
]d.ddde+dd; здесь одна цифра перед точкой, а число цифр после точки равно спецификации 
точности для параметра; если она не задана печатается шесть цифр; 
g Вещественный или с двойной точностью параметр печатается по той спецификации d, f или e, 
которая дает большую точность при меньшей ширине поля; 


Бьерн Страуструп.
Язык программирования С++ 
 
281 
c Символьный параметр печатается. Нулевые символы игнорируются; 
s Параметр считается строкой (символьный указатель), и печатаются символы из строки до 
нулевого символа или до достижения числа символов, равного спецификации точности; но, 
если точность равна 0 или не указана, печатаются все символы до нулевого; 
p Параметр считается указателем и его вид на печати зависит от реализации; 
u Беззнаковый целый параметр печатается в десятичной записи. 
Несуществующее поле или поле с шириной, меньшей реальной, приведет к усечению поля. Дополнение 
пробелами происходит, если только спецификация ширины поля больше реальной ширины. Ниже 
приведен более сложный пример: 
char* src_file_name; 
int line; 
char* line_format = "\n#line %d \"%s\"\n"; 
main() 

line = 13; 
src_file_name = "C++/main.c"; 
printf("int 
a;\n"); 
printf(line_format,line,src_file_name); 
printf("int 
b;\n"); 

в котором печатается 
int a; 
#line 13 "C++/main.c" 
int b; 
Использование printf() ненадежно в том смысле, что нет никакого контроля типов. Так, ниже приведен 
известный способ получения неожиданного результата - печати мусорного значения или чего похуже: 
char x; 
// ... 
printf("bad input char: %s",x); 
Однако, эти функции обеспечивают большую гибкость и знакомы программирующим на С. 
Как обычно, getchar() позволяет знакомым способом читать символы из входного потока: 
int i;: 
while ((i=getchar())!=EOF) { // 
символьный ввод C 
// используем i 

Обратите внимание: чтобы было законным сравнение с величиной EOF типа int при проверке на конец 
файла, результат getchar() надо помещать в переменную типа int, а не char. 
За подробностями о вводе-выводе на С отсылаем к вашему руководству по С или книге Кернигана и 
Ритчи "Язык программирования С". 


Достарыңызбен бөлісу:
1   ...   196   197   198   199   200   201   202   203   ...   256




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет