Студопедия

КАТЕГОРИИ:


Архитектура-(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)

Лекция 10. В стандарте языка С++ отсутствуют средства ввода-вывода

Файлы.

Лекция 9

В стандарте языка С++ отсутствуют средства ввода-вывода. Все операции реализуются с помощью функций. Особенностью языка является отсутствие заранее спланированных структур файлов. Все файлы рассматриваются как неструктурированная последовательность байтов. При таком подходе к организации файлов удалось распространить понятие файла и на различные устройства.

Библиотека языка С++ поддерживает три уровня ввода-вывода:

  1. потоковый ввод-вывод;
  2. ввод вывод нижнего уровня;
  3. ввод-вывод для консоли и портов.

На уровне потокового ввода-вывода обмен данными производится побайтно. Такой ввод-вывод возможен для устройств побайтового обмена (печатающее устройство, дисплей), для файлов на диске. Функции потокового ввода-вывода предоставляют буферизованный форматный и бесформатный ввод-вывод данных. При чтении файла данные помещаются в буфер операционной системы, а затем побайтно или определенными порциями передаются программе. При записи данных в файл, они накапливаются в буфере и при заполнении буфера за одно обращение записываются в виде одного блока в файл.

Функции ввода-вывода сгруппированы в 3-х библиотеках:

ü stdio.h – функции стандартного ввода-вывода, константы, типы, структуры для работы функций обмена с потоком;

ü conio.h – функции консольного терминала и порта;

ü io.h – функции, выполняющие операции над файлами.

Все функции ввода-вывода верхнего уровня можно разделить на группы:

ü доступ к файлам: открытие и закрытие файлов;

ü бесформатный ввод-вывод в текстовые файлы (посимвольный и построчный);

ü форматный ввод-вывод в текстовые файлы;

ü ввод-вывод записей;

ü анализ положения указателя и управление положением указателя;

ü обработка ошибок.

Открытие, закрытие и удаление файлов.

Перед работой необходимо открыть поток, т.е. его инициализировать. При этом поток связывается со структурой типа FILE. В структуре FILE содержатся указатель на буфер, указатель (индикатор) текущей позиции в потоке и другая информация. Указатель на поток объявляется в программе следующим образом:

#include <stdio.h>

FILE *f1;

Открытие файла связывает его с соответствующей структурой типа FILE и производится функцией fopen, имеющей прототип:

FILE *fopen(char *filename, char *type);

- filename – полное имя файла; это может быть указатель-константа, указатель-переменная строки или строковая константа, которая содержит имя файла;

- type – определяет способ доступа к файлу:

  • r – открыть существующий файл для чтения;
  • w – открыть файл для перезаписи (существующий файл с таким именем стирается при открытии);
  • a – открыть файл для дополнения записей в конец существующего файла (если файл не существовал, то он создается);
  • w+ - новый текстовый файл открывается для записи и последующих исправлений. Если файл уже существует, то предыдущее содержимое стирается. Последующие после открытия запись и чтение из него допускаются в любом месте файла, т.е. файл может увеличиваться.
  • r+ - существующий текстовый файл открывается для чтения и для записи в любом месте файла, но режим добавления в конец файла невозможен, т.е. файл не может увеличиваться;
  • а+ - текстовый файл открывается или создается и становится доступен для записи и чтения в любом месте, в том числе и в конце файла.

Поток можно открыть либо в текстовом, либо в бинарном режиме. Для текстового режима в строке type должен быть символ t, для бинарного – b. Например, “wb”. По умолчанию ставится текстовый режим.

FILE *f1, *f2, *f3;

f1=fopen(“t1.txt”,”r”); для чтения

f2=fopen(filename, “a+”); для чтения и дополнения

f3=fopen(“con”,”w”); для вывода данных на экран.

При вводе данных с клавиатуры команда Ctrl+Z интерпретируется как символ конца файла.

Если открытие файла прошло успешно, функция fopen возвращает значение-указатель на переменную типа FILE и связывает файл программы с физическим файлом, а если открытие не состоялось, то функция возвращает NULL.

Открытие может не состояться если:

  • указанный файл не найден на диске;
  • диск заполнен или защищен от записи;
  • недостаточно памяти (т.к. при выполнении функции fopen происходит динамическое выделение памяти.

if (f1==NULL)

printf(“\n ERROR”);

Для вывода на экран текстового сообщения об ошибке при открытии потока используется стандартная библиотечная функция perror(), прототип которой в stdlib.h имеет вид

void perror(const char* s);

функция выводит строку символов, за которой располагается двоеточие, пробел и сообщение об ошибке. Текст сообщения выбирается функцией на основании номера ошибки.

if ((f1=fopen(“t.txt”,”w”))==NULL)

{perror(“\n ошибка при чтении”);

Функция fclose закрывает один заданный поток (файл). Функция fcloseall закрывает все потоки, открытые fopen, кроме stdin, stdout, stderr. Прототипы функций:

int fclose(FILE *stream); int fcloseall();

Например, fclose(f1); fcloseall();

После выполнения этих функций, производится запись буферированных данных их буфера в файл. Все буферы, связанные с потоками, сбрасываются и ОП освобождается. Функция fclose возвращает 0, если поток успешно закрыт. Функция fcloseall возвращает количество закрытых потоков. Если при закрытии произошла ошибка, то обе функции возвращают (-1).

Для удаления файла используется функция remove:

int remove (const char *filename);

Перед удалением файл необходимо закрыть. В случае успешного удаления функция возвращает 0 и не 0 - при неуспешном.

Бесформатный ввод-вывод данных в текстовые файлы.

getc, fgetc – ввод символа из входного потока;

getchar, fgetchar – ввод символов с клавиатуры.

int fgetc(FILE* stream)

Функции getc, getchar читают символ и перемещают указатель на следующий символ. Они возвращают значение кода прочитанного символа или EOF в случае ошибки или конца файла.

char ch;

ch=getc(f1);

Функция ungetc, ungetchar возвращает символ с во входной поток (если был прочитан лишний символ).

int ungetc(int c, FILE *stream);

Возвращаемое значение – код символа или EOF при неудаче.

Функции putc и fputc вводят один символ в текущую позицию входного потока.

int putc(int c, FILE *stream); где с- код вводимого символа

Возвращаемое значение – код символа или EOF при неудаче.

В качестве символов можно использовать и управляющие символы, например, '\n'.

Программа копирует все буквы из одного файла в другой.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

int main()

{

clrscr();

FILE *fout;

FILE *fin;

char c;

fout=fopen("t3.txt","w");

if ((fin=fopen("t1.txt","r"))==NULL)

printf("\nerror\n");

else

{

while ((c=getc(fin))!=EOF) if ((c>'a') && (c<'z')) putc(c,fout);

fclose(fin);

fclose(fout);

}}

Построчный ввод-вывод данных.

char* fgets(char* string, int n, FILE* stream);

string – указатель на значение вводимой строки;

n – количество вводимых символов, увеличенное на 1;

stream – указатель входного потока.

Функция fgets читает строку из входного потока до наступления одного из событий:

1. конец строки (\n), который включается в считанную строку;

2. достигнут конец файла;

3. прочитано (n-1) символов.

Результат помещается в строку и дополняется символом конца строки. Возвращаемое значение – адрес строки (при успешном чтении) и NULL (при достижении конца файла).

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

FILE *f;

f=fopen(“t1.txt”,”r”);

char a[50];

if(!fgets(a,9,f))

printf(“\n Ошибка при вводе”);

Пример ввода строк до конца файла на основе анализа результата feof:

while (! feof(f))

{ fgets(str, 50, f);………})

Функция getpass используется для ввода с клавиатуры пароля, т.е. строки без эхопечати

char* getpass (char *zapros);

где zapros – указатель на символьную константу, содержащую приглашение ко вводу пароля.

char *b;

b=getpass(“\n введите пароль”);

if (strcmp(b,”parol”)) //истинно при несовпадении строк

printf(“\n ошибка”);

 

Построчный вывод данных осуществляется функцией fputs.

int fputs (char* string, FILE *stream)

Функция копирует строку string в поток stream с текущей позиции. Если ввод успешен, то возвращается код последнего введенного символа, если нет – значение EOF.

Программа построчно вводит и выводит данные.

FILE *f1, *f2;

int i;

char d[3][17];

f1=fopen(“t1.txt”,”r”);

f2=fopen(“con”,”w”);

for (i=0;i<3;i++)

{ fgets(d[i], 17, f1));

fputs(d[i], f2);

}

fclose(f1);

fclose(f2);

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

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

#include <string.h>

void main()

{

clrscr();

FILE *fin,*fout;

char *c;

fout=fopen("t3.txt","w");

if ((fin=fopen("t2.txt","r"))==NULL)

printf("\nerror\n");

else

//read from file

while (fgets(c,20,fin)!=NULL)

{

puts(c);

printf("\n%d",strlen(c));

//write to file

if (strlen(c)==4)

fputs(c,fout);

}

fclose(fin);

fclose(fout);

getch();

}

Форматный ввод-вывод дланных текстовых файлов.

При форматном вводе данных введенные значения интерпретируются в соответствии с типом форматов и присваивают эти значения соответствующим переменным.

int fscanf (FILE* stream, char * format [, arg….])

Ввод значений различных типов из файла.

FILE *f1;

int a, e;

float b, d;

char c[7], g, *ft=”a=%d b=%f c=%s”;

f1=fopen(“t1.txt”,”r”);

fscanf(f1, ft, &a, &b, &c[0]);

fclose(f);

Аналогично осуществляется форматный вывод данных

int fprintf (FILE* stream, char * format [, arg….])

Программа переписывает в другой файл каждое второе прочитанное число.

#include <stdio.h>

#include <conio.h>

#include <stdlib.h>

void main()

{

clrscr();

int k,l;

FILE *fin, *fout;

if ((fout=fopen("t4.txt","w"))==NULL)

printf("\nerror w\n");

if((fin=fopen("t2.txt","r"))==NULL)

printf("\nerror\n");

else

{

for(int i=1; i<6; i++)

{

fscanf(fin,"%d %d",&k, &l);

printf("%5d",l);

fprintf(fout," %3d",l);

}

}

getch();

}


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


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


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



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




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