- •( Stream – поток, I - input , o – output)
- •Иерархия потоковых классов (одна ветвь)
- •Стандартные потоки ввода – вывода
- •1) Для целых чисел, 2) для вещественных чисел и 3) для строк
- •Компонентные функции класса ios для форматирования
- •Манипуляторы с параметрами ( определены в файле iomanip.H )
- •Ввод-вывод для типов, определенных пользователем
- •Функции чтения
- •Работа с файлами
- •Ввод-вывод нижнего уровня
- •Текстовой и бинарный файлы
- •Открытие и закрытие файлов
- •Чтение и запись данных
- •Int fd ; // дескриптор файла
Int fd ; // дескриптор файла
…} FILE
Далее в программе должен быть объявлен указатель на структуру типа FILE ( указатель на файловый поток) :
#include<stdio.h>
FILE* F;
При открытии файла функцией fopen структуре типа FILE выделяется ОП, адрес которой, возвращает функция и происходит связь физического файла с указателем потока.
Прототип:
FILE* fopen (char *filename , char *type);
Вызов:
F = fopen (имя файла, режим открытия);
Параметр filename определяет полное имя физического файла
Параметр type определяет режим работы с файлом
«r» - чтение , файл должен быть создан
«w» - создание нового файла для записи
«a» -дополнение записи в конец файла
«+» -допускается чтение из файла и запись в файл
«wb» - запись в бинарный файл
«rb» -чтение из бинарного файла
и.т.д.
FILE *fid, frz, fin;
Fid= fopen («lr.dat», «r») - открыт для чтения
Frz=fopen(«lr.rez», «w») -открыт для вывода
Fin=fopen(«lr.res», «a+») - открыт для чтения и дополнения
При успешном выполнении функция возвращает указатель на FILE.
В противном случае возвращает NULL.
Закрытие файла
Функции закрытия файлового потока:
Прототипы:
int fclose( FILE* stream ); int fcloseall( );
вызов:
fclose(fid);
Возвращает 1-ая- 0 при успешном закрытии
2-ая –количество закрытых потоков
-1 при неуспешном закрытии.
Бесформатный ввод-вывод в текстовой файл
а) посимвольный , б) построчный
а)
Посимвольный ввод
int getchar(void), int fgetchar (void) , -ввод символа с клавиатуры чтение из стандартного потока stdin
int getc (FILE*stream) , int fgetc (FILE*stream) -ввод символа из входного
файла
int getch(void) – ввод символа с клавиатуры без эхопечати.
Посимвольный вывод
int putc ( int c, FILE*stream) ; вывод символа в файл
int fputc(int c, FILE*stream) ;
void putch(int c), putchar(int c, ) вывод символа на экран в стандартный поток stdout
б)
Построчный ввод – вывод
Ввод :
char* gets (char* string) – читает строку из стандартного потока до символа ‘\n’ и помещает ее по адресу параметра string, символ ‘\n’ не включается, результат дополняется символом ’\0’
char* fgets (char* string, int n , FILE*stream) – читает строку из файла
до 1) символа ‘\n’, который включается в строку
-
до конца файла
-
прочитано n-1 символ
результат дополняется символом ’\0’
Функции возвращают адрес строки string или NULL
Вывод:
int puts (char* string) – выводит строку string в стандартный поток stdout до символа ‘\0’ и помещает в довершение символ ‘\n’. После вывода строки курсор переместится на новую строку.
int fputs (char* string, FILE*stream) – выводит строку string в файловый поток stream до символа ‘\0’
Функции возвращают код последнего выведенного символа , или –1, если ошибка вывода.
Форматный ввод- вывод данных в текстовой файл
Функции ввода
int scanf ( char*format [, arg , … ] );
int fscanf( FILE*stream , char*format [, arg , … ] );
И функции вывода
int printf( char*format [, arg , … ] );
int fprintf( FILE*stream, char*format [, arg , … ] );
Эти функции были рассмотрены ранее.
int sscanf ( char*string , char*format [, arg , … ] );– читает даннае из строки
string , « распоковка » строки
int sprintf ( char*string , char*format [, arg , … ] ); - выводит данные в строку , расположенную в ОП. Функция преобразует данные – аргументы в символьный массив. Удобна при работе с графикой , когда нужно вывести на экран числа, а можно выводить только строки.
Функции printf () и scanf ()
-
осуществляют форматированный вывод и ввод в стандартные потоки (по умолчанию на консоль)
-
прототипы в файле STDIO.H
int printf ( char * управляющая строка , arg… );
int scanf ( char * управляющая строка , arg…) ;
-
первый параметр всегда символьная строка, содержащая некоторые символы и команды (спецификаторы) формата сообщающие какие данные надо вводить или как надо выводить аргументы.
Спецификаторы задаются с помощью знака % с буквами и цифрами
-
последующие параметры (их переменное число)- аргументы
для printf – это значения выражений, в частности числа, переменные, константы , строки.
для scanf – это список адресов переменных типы которых, указанных в строке формата для каждого аргумента последовательно ( первый формат соответствует первому аргументу, второй – второму и т. д.)
printf
Функция printf() возвращает общее число выводимых значений при успешном выводе
Int result;
Result =printf (“ … \n”, …)
int
%d , %i – для вывода десятеричных значений;
%0 - в восьмеричном формате;
% x, % X –в шестнадцатеричном;
int v = 255;
printf (“ значение %d в восьмеричном формате %0\n”, v, v )
printf('' значение %d в шестн. формате %x и %X\n’’, v, v,v)
значение 255 в восьмеричном формате 377
значение 255 в шестн. формате ff и FF
unsigned int
%u unsigned int a = 42000
printf (“%u % d\n’’, a, a ) 42000 -23536
long float shot unsigned long double
long int % ld % f % hu % lf
символы % и 0 и x ,X
%% %#0 %#x %#X
char
% c printf ( “ буква %c\n’’ , ‘A’); буква А
printf ( “ буква %c\n’’ , 65); буква А
Вывод чисел с плавающей точкой в экспоненциальном виде: %e или %E
Float a=3.14159 , b= 2.0031;
Printf (‘’ %e %E” , a, b )
3.14159e +00 2.0031E+00
на усмотрение машины %g
printf ( “ %g\n’’, 0.1234) ; printf (“%g\n”,0.000001234)
-
1.234e-06
Строки
%s char t [255]=” Pascal”;
printf ( “ Название-%s\n”, t)
Название – Pascal
Вывод указателей
%p , %n
int v ; printf(“Адрес переменной=%p\n”, &v)
Адрес переменной= FFF4
Вывод числа со знаком(положительным и отрицательным)
%+d %+f int a=5, b=-5; float c= 1.5, d=-1.5;
printf(“%+d %+d %+f %+f ” , a, b , c , d );
+5 -5 +1.5 -1.5
Количество символов- мест для вывода
Int v = 5;
Printf( “%1d \n”,v) 5
Printf( “%2d \n”,v) 5
Printf( “%3d \n”,v) 5
Если дано меньше, чем надо для вывода целого , символьной строки , добавляется необходимые места
Вывод целых с ведущими нулями
Printf( “ %01d\n”, v) 5
Printf( “ %02d\n”, v) 05
Форматирование чисел с плавающей точкой
-
число указывает общее количество символов для вывода
-
число указывает количество символов справа от десятичной точки
float f =1.23456;
printf( “ %8.1f\n”,f) _ _ _ _ _ 1.2
printf( “ %8.3f\n”,f) _ _ _ 1.235
форматирование экспоненциального представления аналогично:
printf( “ %12.1 e\n”, f) _ _ _ _ _ 1.2e+00
printf( “ %12.5 e\n”, f) _ 1.23456e+00
Выравнивание влево и вправо:
Printf ( “ %5d , 5) _ _ _ _ 5
Printf ( “ %-5d , 5) 5 _ _ _ _
Scanf()
Функция производит ввод данных с клавиатуры в переменные , адреса которых задаются аргументами (arg)
Возвращаемое значение функцией – количество успешно введенных и присвоенных значений
Управляющая строка содержит спецификации формата, пробелы и др. символы.
Спецификации:
%c - чтение символа
%d – чтение десятичного целого
%i – чтение десятичного целого
%e- чтение числа типа float
%h- чтение числа типа short int
%0- чтение восьмеричного числа
%s- чтение строки
%x- чтение шестнадцатеричного числа
%p- чтение указателя
-Спецификация формата не содержит пробелов.
Пробельные символы - пробелы ( _ ), символы табуляции ( ‘\t’) , новой строки ('\n') перевода каретки ('\r’) - разделители между двумя вводимыми символами. Символы очередного значения выделяются до первого пробельного символа.
Другие символы (ненулевые) указывают на чтение и отбрасывание этих символов, это любые символы , которые надо игнорировать.
Scanf(“%dplus%d” , &i , &j) поток символов 5plus10
i=5 , j = 10
Переменные должны указываться адресом:
Scanf(“%d %d “, &i , & j);
Scanf(“%5s “, str)
Возможно задать множество поиска - список символов в квадратных скобках
Char s[10],t[10];
Scanf (“%[0123456789]%s’’,s ,t )
Поток ввода : 123прлаы456
S= “123” t= “прлаы456”
Ввод – вывод записей
Используется бинарный режим обмена с файлом , состоящим из записей фиксированной длины. В одном обмене может участвовать одна и более записей.
Чтение записей из файла в переменные ОП:
int fread ( void*ptr , unsigned size ,int k, FILE*stream)
Ptr- адрес ОП переменной любого типа, в которую читается запись
Size- длина записи в байтах
K- количество записей
Stream- имя указателя на файловый поток , связанного с файлом из которого считывают данные
Вывод записей в файл:
int fwrite ( const void*ptr , unsigned size ,int k, FILE*stream)
Из переменной ОП , адресуемой ptr , считываются k записей и записываюся в файл, связанный с потоком stream.
Возвращаемое значение всех этих функций - это количество прочитанных или записанных значений ( или записей).
Дополнительные функции:
int feof ( FILE*stream) - возвращает 0 , если конец файла не достигнут и не
нуль – если достигнут
int fseek(FILE*stream, long offset , int n) – устанавливает указатель для чтения или записи в нужное место
offset -смещение от начала, которое задается параметром n
SEEK_SET=0
SEEK_CUR=1
SEEK_END=2
Возвращает 0 – если указатель перемещен успешно и не ноль в обратном случае.
void rewind (FILE*stream) – устанавливает указатель на начало файла.
Массивы файлов
Если надо одновременно работать с несколькими файлами , целесообразно использовать массивы файлов.
FILE*f[k] //– объявление массива файлов
//Удобно формировать имена файлов, включающие номер файла.
Char* s =new char[14];
Char*s1=new char [4] ;
For(int i=0; i<k ; i++)
{strcat ( strcat ( strcpy ( s , «file»), itoa( i , s1 ,10) ) , «.dat»)
f[i]=fopen(s, «w»);} …
Аналогично можно определить и с помощью классов. Определить массив объектов класса.
ofstream fout[i];
Char* s =new char[14];
Char*s1=new char [4] ;
For(int i=0; i<k ; i++)
{strcat ( strcat ( strcpy(s , «file»), itoa( i , s1 ,10) ) , «.dat»)
fout[i].open(s, ios::out ); }…