Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Ввод-вывод.doc
Скачиваний:
8
Добавлен:
18.04.2015
Размер:
273.92 Кб
Скачать

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’, который включается в строку

  1. до конца файла

  2. прочитано 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…) ;

  1. первый параметр всегда символьная строка, содержащая некоторые символы и команды (спецификаторы) формата сообщающие какие данные надо вводить или как надо выводить аргументы.

Спецификаторы задаются с помощью знака % с буквами и цифрами

  1. последующие параметры (их переменное число)- аргументы

для 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. 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

Форматирование чисел с плавающей точкой

  1. число указывает общее количество символов для вывода

  2. число указывает количество символов справа от десятичной точки

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 ); }…

31