Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Открытие потока. Передача массивов в качестве параметров

Передача массивов в качестве параметров

СОВЕТ

Рекомендуется указывать const перед всеми параметрами, изменение которых в функции не предусмотрено. Это облегчает отладку больших программ, так как по заголовку функ­ции можно сделать вывод о том, какие величины в ней изменяются, а какие нет.

 

 

При использовании в качестве параметра массива в функцию передается-указатель на его первый элемент, иными словами, массив всегда передается по адресу. При этом информация о количестве элементов массива теряется, и следует передавать его разменость через отдельный параметр1 (в случае массива символов, то есть строки, ее фактическую длину можно определить по положению нуль-символа):

 

#include <1ostream.h>

int sum(const int* mas, const int n);

int const n = 10;

int main(){

int marks[n] = {3, 4. 5, 4, 4};

cout “ "Сумма элементов массива: " “ sum(marks, n):

return 0;

}

int sum(const int* mas, const int n){

// варианты: int sum(int mas[], int n) // или

int sum(int mas[n], int n)

// (величина n должна быть константой) int s = 0:

for (int i = 0; i<n; i++) s += mas[i];

return s: }

 

 

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

Раздел 8. Файлы(потоки)

Функции ввода/вывода

 

Ввод/вывод в C++ реализуется либо с помощью функций, унаследованных от биб­лиотеки С, либо с помощью потоков C++. Смешивать эти два способа в одной про­грамме можно только синхронизировав ввод с помощью функции sync_with_stdio(). Каждый способ имеет свои преимущества. Преимущество использования пото­ков в том, что они легче в использовании в простых случаях ввода/вывода, не требующих форматирования, а, главное, потоковые операции можно переопреде­лить для собственных классов. Ввод/вывод в стиле С удобнее использовать при форматированном выводе в программах, не использующих объектно-ориентиро­ванную технику. Кроме того, существуют миллионы строк, написанных на С и перенесенных на C++, с которыми программисту приходится сталкиваться. По­токи C++ рассматриваются в разделе «Потоковые классы».

Для использования функций ввода/вывода в стиле С необходимо подключить к программе заголовочный файл <stdio.h> или <cstdio>. При вводе/выводе данные рассматриваются как поток байтов. Физически поток представляет собой файл или устройство (например, клавиатуру или дисплеи, рассматривающиеся как ча­стный случай файла).

 

 

Работа с потоком начинается с его открытия. Поток можно открыть для чтения и/или записи в двоичном или текстовом режиме. Функция открытия потока имеет формат:

 

FILE* fopen(const char* filename, const char* mode);

 

При успешном открытии потока функция возвращает указатель на предопреде­ленную структуру типа FILE, содержащую всю необходимую для работы с пото­ком информацию, или NULL в противном случае. Первый параметр —.имя откры­ваемого файла в виде С-строки, второй — режим открытия файла:

"r" — файл открывается для чтения;

"w" — открывается пустой файл для записи (если файл существует, он стирается);

"а" — файл открывается для добавления информации в его конец;

"r+" — файл открывается для чтения и записи (файл должен существовать);

"w+" — открывается пустой файл для чтения и записи (если файл существует, он стирается);

"а+" — файл открывается для чтения и добавления информации в его конец.

Режим открытия может также содержать символы t (текстовый режим) или b (двоичный режим), отличающиеся обработкой символов перехода на новую строку. По умолчанию файл открывается в текстовом режиме, при котором ком­бинация символов «возврат каретки» и «перевод строки» (0x13 0x10) при вводе преобразуются в одиночный символ перевода строки (при выводе выполняется обратное преобразование). В двоичном режиме эти преобразования не выполня­ются.

Пример:

 

FILE *f = fopen("d:\\cpp\\data", "rb+");

 

Указатель f используется в дальнейших операциях с потоком. Его передают функциям ввода/вывода в качестве параметра.

При открытии потока с ним связывается область памяти, называемая буфером. При выводе вся информация направляется в буфер и накапливается там до за­полнения буфера или до закрытия потока. Чтение осуществляется блоками, рав­ными размеру буфера, и данные читаются из буфера. Буферизация позволяет более быстро и эффективно обмениваться информацией с внешними устройства­ми. Следует иметь в виду, что при аварийном завершении программы выходной буфер может быть не выгружен, и возможна потеря данных. С помощью функ­ций setbuf и setvbuf можно управлять размерами и наличием буферов.

Существует пять предопределенных потоков, которые открываются в начале ра­боты программы: стандартный ввод stdin, стандартный вывод stdout, стандарт­ный вывод сообщений об ошибках stderr, стандартный дополнительный поток stdaux и стандартная печать stdprn. Первые три потока по умолчанию относятся к консоли. Эти указатели можно использовать в любой функции ввода/вывода там, где требуется указатель потока.

 

Ввод/вывод в поток

 

Ввод/вывод в поток можно осуществлять различными способами: в виде после­довательности байтов, в виде символов и строк или с использованием формат­ных преобразований. Для каждого вида операций определен свой набор функ­ций. Они описаны в приложении 6 на с. 409.

Операции ввода/вывода выполняются начиная с текущей позиции потока, опре­деляемой положением указателя потока. Указатель устанавливается при откры­тии на начало или конец файла (в соответствии с режимом открытия) и изменя­ется автоматически после каждой операции ввода/вывода. Текущее положение указателя можно получить с помощью функций ftel1 и fgetpos и задать явным образом с помощью функций fseek и fsetpos. Эти функции нельзя использовать для стандартных потоков. Ниже перечислены основные функции ввода/вывода потока.

 

· Чтение и запись потока байтов выполняют функции fread и fwrite.

· Чтение символа из потока — getc, fgetc, из стандартного потока stdin -getchar.

а Запись символа в поток — putc, fputc, в стандартный поток stdout — putchar. - Чтение строки из потока — fgets, из стандартного потока stdin — gets. - Запись строки в поток — fputs, в стандартный поток stdout — puts.

· Форматированный ввод из потока — fscanf, из стандартного потока stdin -scant, из строки — sscanf.

· Форматированный вывод в поток — fprintf, в стандартный поток stdout -printf, в строку — sprlntf.

 

<== предыдущая лекция | следующая лекция ==>
Объявление и определение функций | Програма курсу
Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 632; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.011 сек.