Файловые операции в языке программирования С++

Изучение файловых операций ввода/вывода с использованием библиотеки управления потоками C++. Характеристика и функции основных операторов, которые позволяют читать и записывать данные в файл. Создание программы с использованием операторов ввода/вывода.

Рубрика Программирование, компьютеры и кибернетика
Вид реферат
Язык русский
Дата добавления 01.12.2009
Размер файла 22,9 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

15

Волжский Университет им. В.Н, Татищева

Факультет Информатики и Телекоммуникаций

РЕФЕРАТ

тема: “Файловые операции ввода/вывода в языке C++

Выполнил студент

группы ИТ-203

Боков Андрей

Преподаватель

Ахмедханлы Д.М.

ОГЛАВЛЕНИЕ

Файловые операции ввода/вывода

Stream-библиотека C++

Общие функции потокового ввода/вывода

Функция-компонент open

Функция-компонент close

Последовательный текстовый поток ввода/вывода

Функция-элемент getline

Последовательный двоичный файловый ввод/вывод

Функция-элемент write

Функция-элемент read

Файловый ввод/вывод с прямым доступом

Функция-элемент seekg

Описание 10-ой лабораторной работы

Заключение

ФАЙЛОВЫЕ ОПЕРАЦИИ ВВОДА/ВЫВОДА

Этот реферат посвящен файловым операциям ввода/вывода с использованием библиотеки управления потоками C++. Есть две возможности: либо использовать функции файлового ввода/вывода, описанные в заголовочном файле STDIO.H, либо функции stream-библиотеки C++. Каждая из этих библиотек имеет множество мощных и удобных функций. В этом реферате я представлю основные операторы, которые позволяют читать и записывать данные в файл. В данном реферате я затрону следующие темы:

Стандартные функции потоков ввода/вывода

Последовательный ввод/вывод потока с текстовой информацией

Последовательный ввод/вывод двоичных данных

Прямой доступ к потоку двоичных данных

STREAM-БИБЛИОТЕКА C++

Stream-библиотека (известная также как библиотека iostream) выполнена в виде иерархии классов, которые описаны в нескольких заголовочных файлах. Файл IOSTREAM.H, используемый до сих пор, - это только один из них. Другой, который будет интересен в этой главе, - FSTREAM.H. Файл IOSTREAM.H поддерживает основные классы для ввода/вывода потока. Файл FSTREAM.H содержит определения для основных классов файлового ввода/вывода.

Существуют дополнительные файлы библиотеки ввода/вывода, в которых имеются более специализированные функции ввода/вывода.

Общие функции потокового ввода/вывода

В этом разделе представлены функции-элементы ввода/вывода, являющиеся общими как для последовательного, так и для прямого доступа. Эти функции включают open, close, good и fail в дополнение к операции !. Функция open открывает файловый поток для ввода, вывода, добавления, а также для ввода и вывода. Эта функция позволяет указывать тип данных, с которыми вы собираетесь работать: двоичные или текстовые.

При работе с файловым вводом/выводом очень важно знать различие между текстовым и двоичным режимами. Текстовый режим предназначен для текстовых файлов, в которых имеются строки обычного текста. Двоичный режим используется для любых других и особенно для файлов, которые сохраняются в форматах, неудобных для чтения человеком.

Существуют некоторые особые тонкости, связанные с файлами текстового режима, на которые следует обратить особое внимание и запомнить. Первая из них - символ EOF (26 в коде ASCII или Ctrl+Z) - представляет собой метку (символ) конца файла. В текстовом режиме, где встречается символ EOF, система C++ низкого уровня автоматически продвигается к концу файла; вы ничего не можете прочитать после специального символа. Это может вызвать проблемы, если такой специальный символ окажется в середине файла.

Другая особенность текстового режима заключается в том, как интерпретируются строки текстового файла. Каждая строка заканчивается последовательностью конца строки (EOL). На компьютерах под управлением операционных систем производства Microsoft EOL-последовательность представлена двумя символами кода ASCII: CR (13 в коде ASCII или Ctrl+M) и LF (10 в коде ASCII или Ctrl+J). Эта CRLF-последовательность используется функциями чтения и записи текстовой строки, которые автоматически, вставляют ее в файл или удаляют из него. Заметьте, что на большинстве других, операционных систем (unix-like и Macintosh) EOF просто является символом LF.

ФУНКЦИЯ-КОМПОНЕНТ OPEN

Прототип функции open

void open (const char* filename, int mode, int m = filebuf::openprot);

Параметр filename задает имя открываемого файла. Параметр mode указывает режим ввода/вывода. Далее следует список аргументов для mode, описанных в заголовочном файле FSTREAM.H:

in открыть поток для ввода,

out открыть поток для вывода,

ate установить указатель потока на конец файла,

app открыть поток для добавления,

trunk удалить содержимое файла, если он уже существует (bc++5),

nocreate инициировать ошибку, если уже не существует,

noreplace инициировать ошибку, если файл уже существует,

binary открыть в двоичном режиме.

Пример 1.

// открыть поток для ввода

fstream f;

f.open("simple.txt", ios::in);

// открыть поток для вывода fstream f;

fstream f;

f.open ("simple.txt", ios::out);

// открыть поток ввода/вывода для двоичных данных fstream f;

fstream f;

f.open("simple.txt", ios::in | ios::out | ios::binary);

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

ФУНКЦИЯ-КОМПОНЕНТ CLOSE

Прототип для функции close:

void close();

Пример 2.

fstream f;

// открыть поток

f.open ( "simple.txt", ios::in);

// работа с файлом

// закрыть поток

f.close ();

Stream-библиотека C++ Включает в себя набор основных функций, которые контролируют состояние ошибки потоковой операции. Эти функции включают следующие:

Функция good() возвращает ненулевое значение, если при выполнении потоковой операции не возникает ошибки. Объявление функции good: int good();

Функция fail() возвращает ненулевое значение, если при выполнении потоковой операции возникает ошибка. Объявление функции fail: int fail();

Перегруженная операция ! применяется к экземпляру потока для определения состояния ошибки.

Stream-библиотека C++ предоставляет дополнительные функции для установки и опроса других аспектов и типов ошибок потока.

ПОСЛЕДОВАТЕЛЬНЫЙ ТЕКСТОВЫЙ ПОТОК ВВОДА/ВЫВОДА

Функции и операции последовательного текстового ввода/вывода являются довольно простыми. Эти функции и операции включают:

Операция извлечения из потока << записывает строки или символы в поток.

Операция помещения в поток >> читает символы потока.

Функция getline читает строку из потока.

ФУНКЦИЯ-ЭЛЕМЕНТ GETLINE

Прототипы функции-элемента getline:

istream& getline (char* buffer, int size, char delimiter = '\n');

istream& getline (signed char* buffer, int size, char delimiter = '\n');

istream& getline (unsigned char* buffer, int size, char delimiter = '\n');

Параметр buffer - это указатель на строку, принимающую символы из потока. Параметр size задает максимальное число символов для чтения. Параметр delimiter указывает разделяющий символ, который вызывает прекращение ввода строки до того, как будет введено количество символов, указанное в параметре size. По умолчанию параметру delimiter присваивается значение '\n'.

Пример 3.

fstream f;

char textLine[MAX];

f.open("sample.txt", ios::in);

while (!f.eof()) {

f.getline(textLine, MAX);

cout << textLine << endl;

}

f.close();

ПОСЛЕДОВАТЕЛЬНЫЙ ДВОИЧНЫЙ ФАЙЛОВЫЙ ВВОД/ВЫВОД

Stream-библиотека C++ имеет перегруженные потоковые функции-элементы write и read для последовательного двоичного файлового ввода/вывода. Функция write посылает ряд байт в выходной поток. Эта функция может записывать любую переменную или экземпляр в поток.

ФУНКЦИЯ-ЭЛЕМЕНТ WRITE

Прототип перегруженной функции-элемента:

ostream& write(const char* buff, int num);

ostream& write(const signed char* buff, int num);

ostream& write(const unsigned char* buff, int num);

Параметр buff - это указатель на буфер, содержащий данные, которые будут посылаться в выходной поток. Параметр num указывает число байт в буфере, которые передаются в этот поток.

Пример 4.

const MAX = 80;

char buff[MAX+1] = "Hello World!";

int len = strlen (buff) + 1;

fstream f;

f.open("CALC.DAT", ios::out | ios::binary);

f.write((const unsigned char*) &len, sizeof(len));

f.write((const unsigned char*) buff, len);

f.close();

В этом примере открывается файл CALC.DAT, записывается целое, содержащее число байт в строке и записывается сама строка перед тем, как файл закрывается.

Функция read считывает некоторое количество байт из входного потока. Эта функция может считывать любую переменную или экземпляр из потока.

ФУНКЦИЯ-ЭЛЕМЕНТ READ

Прототип перегруженной функции-элемента read:

ostream& read(char* buff, int num);

ostream& read(signed char* buff, int num);

ostream& read(unsigned char* buff, int num);

Параметр buff - это указатель на буфер, который принимает данные из входного потока. Параметр num указывает число считываемых из потока байт.

Пример 5.

const MAX = 80;

char buff [MAX+1];

int len;

fstream f;

f.open("CALC.DAT", ios::in | ios::binary);

f.read((unsigned char*) &len, sizeof(len));

f.read((unsigned char*) buff, len);

f.close();

В этом примере считывается информация, записанная в предыдущем примере.

ФАЙЛОВЫЙ ВВОД/ВЫВОД С ПРЯМЫМ ДОСТУПОМ

Файловые операции ввода/вывода прямого доступа также используют потоковые функции-элементы read и write, представленные в предыдущем разделе. Stream-библиотека имеет ряд функций, позволяющих передвигать указатель потока в любое необходимое положение. Функция-элемент seekg - одна из таких функций.

ФУНКЦИЯ-ЭЛЕМЕНТ SEEKG

Прототип для перегруженной функции-компонента seekg:

istream& seekg(long pos);

istream& seekg(long offset, seek_dir dir);

Параметр pos в первой версии определяет абсолютное положение байта в потоке. Во второй версии параметр offset определяет относительное смещение, в зависимости от аргумента dir. Аргументы для последнего параметра:

ios::beg С начала файла

ios::cur С текущей позиции файла

ios::end С конца файла

Пример 6.

const BLOCK SIZE = 80

char buff[BLOCK_SIZE] = "Hello World!";

f.open("CALC.DAT", ios::in | ios::out | ios::binary);

f.seekg(3 * BLOCK_SIZE); // продвинутся к блоку 4

f.read((const unsigned char*)buff, BLOCK_SIZE);

cout < buff < endl;

fclose ();

ОПИСАНИЕ 10-ОЙ ЛАБОРАТОРНОЙ РАБОТЫ

Задание: Дан файл, содержащий сведения о личной коллекции книголюба. Каждая запись содержит поля - шифр книги, автор, названия, год издания, местоположение (номер стеллажа, шкафа и т. п.). Написать программу, выдающую следующую информацию:

- местоположение книги автора Х названия Y;

- список автора Z, находящихся в коллекции;

- число книг издания ХХ года.

Значения книг Х, Y, Z и год издания вводятся по запросу с терминала.

Листинг программы:

#include <fstream.h>

#include <conio.h>

#include <string.h>

struct books

{

char id[100];

char author[100];

char title[100];

int dop;

int n_shkafa;

int n_polki;

};

void add_book()

{

books buf;

ofstream f("lab_10.dat",ios::app);

char s[100];

memset(&buf,0,sizeof(books));

cout<<"Введите информацию о книге:"<<endl;

cout<<"\tшифр: ";

cin.getline(s,sizeof(s));

cin.getline(s,sizeof(s));

strcpy(buf.id,s);

cout<<"\tавтор: ";

cin.getline(s,sizeof(s));

strcpy(buf.author,s);

cout<<"\tназвание: ";

cin.getline(s,sizeof(s));

strcpy(buf.title,s);

cout<<"\tгод издания: ";

cin>>buf.dop;

cout<<"\tместоположение:\n\t\t№ шкафа: ";

cin>>buf.n_shkafa;

cout<<"\t\t№ полки: ";

cin>>buf.n_polki;

f.write((char *)&buf,sizeof(books));

f.close();

}

void show_book()

{

books buf;

ifstream f("lab_10.dat");

char author_x[100],title_y[100];

cout<<"Введите автора книги: ";

cin.getline(author_x,sizeof(author_x));

cin.getline(author_x,sizeof(author_x));

cout<<"Введите название книги: ";

cin.getline(title_y,sizeof(title_y));

for(;;)

{

memset(&buf,0,sizeof(books));

f.read((char *)&buf,sizeof(books));

if (f.eof()) break;

if((*buf.author==*author_x) && (*buf.title==*title_y))

cout<<"\nМестоположение книги:\n\t№ шкафа: "<<buf.n_shkafa<<"\n\t№ полки: "<<buf.n_polki;

}

f.close();

cout<<"\n\nPress any key to continue...";

getch();

}

void show_author()

{

books buf;

char author_z[100];

ifstream f("lab_10.dat");

cout<<"Введите автора книги: ";

cin.getline(author_z,sizeof(author_z));

cin.getline(author_z,sizeof(author_z));

clrscr();

cout<<"Список книг автора "<<author_z<<", находящихся в коллекции:\n";

for(;;)

{

memset(&buf,0,sizeof(books));

f.read((char *)&buf,sizeof(books));

if(f.eof()) break;

if(*buf.author==*author_z)

cout<<"\t"<<buf.title<<", "<<buf.dop<<" год издания (местоположение: № шкафа: "<<buf.n_shkafa<<", номер полки: "<<buf.n_polki<<")\n";

}

f.close();

cout<<"\nPress any key to continue...";

getch();

}

void show_num()

{

books buf;

int dop_xx,k=0;

ifstream f("lab_10.dat");

cout<<"Введите год издания: ";

cin>>dop_xx;

clrscr();

for(;;)

{

memset(&buf,0,sizeof(books));

f.read((char *)&buf,sizeof(books));

if(f.eof()) break;

if(buf.dop==dop_xx) k++;

}

f.close();

cout<<"Число книг издания "<<dop_xx<<" года издания: "<<k;

cout<<"\n\nPress any key to continue...";

getch();

}

void main(void)

{

#define kol 5

int choice,i;

char menu[kol][100]={"1. Добавить книгу в коллекцию",

"2. Показать месторасположение книги",

"3. Показать список автора",

"4. Показать число книг",

"5. Выход"};

textcolor(10);

do

{

clrscr();

for(i=0;i<kol;i++) cout<<menu[i]<<endl;

cout<<"Ваш выбор: ";

cin>>choice;

clrscr();

switch(choice)

{

case 1: add_book();break;

case 2: show_book();break;

case 3: show_author();break;

case 4: show_num();break;

default: ;

}

}

while(choice!=5);

}

В программе описывается структура books, содержащая поля - шифр книги, автор, название, год издания, местоположение (номер шкафа, номер полки). Управление программой происходит из меню. Процедура add_book() открывает файл в режиме добавления, считывает с клавиатуры шифр книги, автора, название, год издания, местоположение. Затем записывает данные в файл. Процедура show_book() открывает файл на чтение, считывает с консоли автора и название книги, и производит поиск в файле. Если находит книгу по заданным условиям то выводит на экран местоположение книги (номер шкафа и номер полки). Процедура show_author() считывает с терминала автора книги и, производя поиск по коллекции, выводит список книг данного автора, находящихся в коллекции. Процедура show_num() подсчитывает число книг введённого года издания.

ЗАКЛЮЧЕНИЕ

Данный реферат представил краткое введение в библиотеку ввода/вывода C++ и вынес на обсуждение следующие вопросы:

Общие функции ввода/вывода, включая open, close, good, fail и оператор !.

Функция open открывает файловый поток ввода/вывода и поддерживает попеременный и множественный режимы ввода/вывода. Функция close закрывает файловый поток. Функции good и fail индицируют успешную или ошибочную, соответственно, потоковую операцию ввода/вывода.

C++ позволяет выполнять последовательный потоковый ввод/вывод для текста с использованием операций < и >, так же как и при помощи потоковой функции getline. Операция < позволяет записать символы и строки (а также и другие предопределенные типы данных). Операция > применяется для получения символов. Функция getline позволяет вашему приложению считывать строки с клавиатуры или из текстового файла.

Последовательный потоковый ввод/вывод двоичных данных использует потоковые функции write или read для записи или считывания данных из переменных любого типа.

Потоковый ввод/вывод прямого доступа для двоичных данных использует функцию seekg в объединении с функциями read и write. Функция seekg позволяет передвигать потоковый указатель либо в абсолютное, либо в относительное положение в потоке.


Подобные документы

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

    лабораторная работа [62,0 K], добавлен 15.07.2010

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

    лабораторная работа [33,8 K], добавлен 15.07.2009

  • Организация файлов и доступ к ним. Файловые операции. Программирование с использованием встроенных функций ввода-вывода; линейных, разветвляющихся и циклических вычислительных процессов с использованием If-else, оператора выбора Case; массивов и матриц.

    курсовая работа [5,8 M], добавлен 24.05.2014

  • Программирование линейных алгоритмов. Процедуры ввода READ и READLN и вывода WRITE и WRITELN. Примеры решения задач на языке Паскаль. Оператор присваивания и выражения. Основные способы формирования структурных операторов. Операторы вызова процедур.

    курсовая работа [44,3 K], добавлен 18.03.2013

  • Характеристика базовых конструкций языков программирования. Изучение истории их развития и классификации. Определение основных понятий языков программирования. Описание основных операторов, которые используются в языках программирования высокого уровня.

    курсовая работа [400,6 K], добавлен 10.11.2016

  • Обеспечение использования принтера в прикладных пакетах. Приемы управления работой печатающих устройств в MS-DOS. Стандартныe файлы ввода и вывода, пeрeнаправлeниe вывода. Обмен данными с файлом. Проектирование символов для матричных принтеров.

    курсовая работа [2,0 M], добавлен 26.06.2011

  • Использование программой функции ввода-вывода данных для реализации дружественного интерфейса с пользователем. Функции консоли и особенности их применения для обеспечения аккуратного ввода информации и упорядоченного вывода. Обзор стандартных функций.

    лабораторная работа [40,4 K], добавлен 06.07.2009

  • Разработка программы обработки типизированных файлов с кодом на языке Object Pascal, с использованием компонентов Delphi для ввода и вывода данных. Разработка экранных форм и алгоритма программы. Описание программных модулей и инструкция оператору.

    курсовая работа [1,5 M], добавлен 08.02.2011

  • Написание модуля на языке Ассемблер для вычисления значения выражения. Составление программы корректного ввода исходных данных в таблицу и вывода результата в виде таблицы. Создание модуля для обработки строк и программы корректного ввода исходных данных.

    курсовая работа [36,8 K], добавлен 18.09.2010

  • Особенности применения светодиодной индикации в микроконтроллерных системах. Характеристика основных приемов программирования универсальных портов ввода-вывода микроконтроллеров AVR. Этапы проектирования елочной гирлянды с микроконтроллерным управлением.

    лабораторная работа [291,7 K], добавлен 17.11.2012

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.