Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп
Книгу Программирование. Принципы и практика использования C++ Исправленное издание - Бьёрн Страуструп читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!
Шрифт:
Интервал:
Закладка:
{
printf("double %g string %s int %d char %cn", d, s, i, ch);
}
где символы %g означают: “Напечатать число с плавающей точкой, используя универсальный формат”, символы %s означают: “Напечатать С-строку”, символы %d означают: “Напечатать целое число, используя десятичные цифры,” а символы %c означают: “Напечатать символ”. Каждый такой спецификатор формата связан со следующим, до поры до времени не используемым аргументом, так что спецификатор %g выводит на экран значение переменной d; %s — значение переменной s, %d — значение переменной i, а %c — значение переменной ch. Полный список форматов функции printf() приведен в разделе Б.10.2.

char a[] = { 'a', 'b' }; /* нет завершающего нуля */
void f2(char* s, int i)
{
printf("goof %sn", i); /* неперехваченная ошибка */
printf("goof %d: %sn", i); /* неперехваченная ошибка */
printf("goof %sn", a); /* неперехваченная ошибка */}
Интересен эффект последнего вызова функции printf(): она выводит на экран каждый байт участка памяти, следующего за элементом a[1], пока не встретится нуль. Такой вывод может состоять из довольно большого количества символов.
Недостаток проверки типов является одной из причин, по которым мы предпочитаем потоки iostream, несмотря на то, что стандартный механизм ввода-вывода, описанный в библиотеке stdio языков C и C++, работает одинаково. Другой причиной является то, что функции из библиотеки stdio не допускают расширения: мы не можем расширить функцию printf() так, чтобы она выводила на экран значения переменных вашего собственного типа. Для этого можно использовать потоки iostream. Например, нет никакого способа, который позволил бы вам определить свой собственный спецификатор формата %Y для вывода структуры struct Y.
Существует полезная версия функции printf(), принимающая в качестве первого аргумента дескриптор файла.
int fprintf(FILE* stream, const char* format, ...);
Рассмотрим пример.
fprintf(stdout,"Hello, World!n"); // идентично
// printf("Hello,World!n");
FILE* ff = fopen("My_file","w"); // открывает файл My_file
// для записи
fprintf(ff,"Hello, World!n"); // запись "Hello,World!n"
// в файл My_file
Дескрипторы файлов описаны в разделе 27.6.3.
27.6.2. Ввод
Ниже перечислены наиболее популярные функции из библиотеки stdio.
int scanf(const char* format, ...); /* форматный ввод из потока stdin */
int getchar(void); /* ввод символа из потока stdin */
int getc(FILE* stream); /* ввод символа из потока stream*/
char* gets(char* s); /* ввод символов из потока stdin */
Простейший способ считывания строки символов — использовать функцию gets(). Рассмотрим пример.
char a[12];
gets(a); /* ввод данных в массив символов a вплоть до символа 'n' */

Функция scanf() считывает данные с помощью формата точно так же, как и функция printf(). Как и функция printf(), она может быть очень удобной.
void f()
{
int i;
char c;
double d;
char* s = (char*)malloc(100);
/* считываем данные в переменные, передаваемые как указатели: */
scanf("%i %c %g %s", &i, &c, &d, s);
/* спецификатор %s пропускает первый пробел и прекращает
действие на следующем пробеле */
}


char buf[20];
scanf("%19s",buf);
Нам требуется участок памяти, заканчивающийся нулем (содержание которого вводится функцией scanf()), поэтому 19 — это максимальное количество символов, которое можно считать в массив buf. Однако этот способ не отвечает на вопрос, что делать, если некто введет больше 19 символов. Лишние символы останутся в потоке ввода и будут обнаружены при следующей попытке ввода.
Проблема с функцией scanf() означает, что часто благоразумно и легче использовать функцию getchar(). Типичный ввод символов с помощью функции getchar() выглядит следующим образом:
while((x=getchar())!=EOF) {
/* ... */
}
Макрос EOF, описанный в библиотеке stdio, означает “конец файла”; см. также раздел 27.4.
Альтернативы функций scanf("%s") и gets() в стандартной библиотеке языка C++ от этих проблем не страдают.
string s;
cin >> s; // считываем слово
getline(cin,s); // считываем строку
27.6.3. Файлы
В языке C (и C++) файлы можно открыть с помощью функции fopen(), а закрыть — с помощью функции fclose(). Эти функции, вместе с представлением дескриптора файлов FILE и макросом EOF (конец файла), описаны в заголовочном файле <stdio.h>.
FILE *fopen(const char* filename, const char* mode);
int fclose(FILE *stream);
По существу, мы используем файлы примерно так:
void f(const char* fn, const char* fn2)
{
FILE* fi = fopen(fn, "r"); /* открываем файл fn для чтения
Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.
Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.
- 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
- 2. Просьба отказаться от оскорблений, угроз и запугиваний.
- 3. Просьба отказаться от нецензурной лексики.
- 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.
Надеемся на Ваше понимание и благоразумие. С уважением, администратор knigkindom.ru.
Оставить комментарий
-
Christine26 июнь 01:23 Сначала было тежеловта читать, но потом всё изменилось, я с удовольствием прочитала, спасибо за книгу. Я прочитала весь цикл... Опасное влечение - Полина Лоранс
-
Тамаринда21 июнь 12:33 Редко что-то цепляет, но тут было всё живое, жизненное, чувственное, сильное, читайте, не пожалеете о своём времени...... Хрупкая связь - Ольга Джокер
-
Гость Марина20 июнь 06:08 Книга очень понравилась, хотя и длинная. Героиня сильная личность. Да и герой не подкачал. ... Странная - Татьяна Александровна Шумкова