Студопедия Главная Случайная страница Обратная связь

Разделы: Автомобили Астрономия Биология География Дом и сад Другие языки Другое Информатика История Культура Литература Логика Математика Медицина Металлургия Механика Образование Охрана труда Педагогика Политика Право Психология Религия Риторика Социология Спорт Строительство Технология Туризм Физика Философия Финансы Химия Черчение Экология Экономика Электроника

Лабораторная работа № 10. Работа с файлами




 

Цель работы: овладеть навыками алгоритмизации и программирования файловых структур данных; научиться проектировать структуры файла, запись данных в файл, ввод данных из файла.

 

Краткие теоретические сведения

Используя класс ostream, программы могут выполнять вывод в cout с использованием оператора вставки или различных методов класса, например cout.put. Заголовочный файл iostream.h определяет выходной поток cout. Аналогично, заголовочный файл fstream.h определяет класс выходного файлового потока с именем ofstream. Используя объекты класса ofstream, программы могут выполнять вывод в файл. Для начала необходимо объявить объект типа ofstream, указав имя требуемого выходного файла как символьную строку:

ofstream file_object("FILENAME.EXT");

Если указано имя файла при объявлении объекта типа ofstream, C++ создаст новый файл на диске, используя указанное имя, или перезапишет файл с таким же именем, если он уже существует на вашем диске.

#include <fstream.h>

void main(void)

{ ofstream book_file("BOOKINFO.DAT");

book_file << "Учимся программировать, " << "Вторая редакция"

<< endl;

book_file << "Jamsa Press" << endl;

book_file << "22.95" << endl;

}

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

ifstream input_file("file name.EXT");

Чтобы определить конец файла, ваши программы могут использовать функцию еоf потокового объекта. Эта функция возвращает значение 0, если конец файла еще не встретился, и 1, если встретился конец файла. Используя цикл while, ваши программы могут непрерывно читать содержимое файла, пока не найдут конец файла, как показано ниже:

while (! input_file.eof())

{

// Операторы

}

В данном случае программа будет продолжать выполнять цикл, пока функция eof возвращает ложь (0). Ниже приведен краткий обзор основных функций.

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

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

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

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

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

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

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

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

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

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

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

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

 

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

При открытии потока с ним связывается область памяти, называемая буфером. При выводе вся информация направляется в буфер и накапливается там до заполнения буфера или до закрытия потока. Чтение осуществляется блоками, равными размеру буфера, и данные читаются из буфера. Ниже перечислены основные функции ввода/вывода потока.

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

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

· Запись символа в поток — putc, fputc, в стандартный поток stdout — putchar.

· Чтение строки из потока — fgets, из стандартного потока stdin — gets.

· Запись строки в поток — fputs, в стандартный поток stdout — puts.

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

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

Поток закрывается либо при завершении программы, либо явным образом с помощью функции fclose:

int fclose(FILE*);

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

 

 

Задание

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

2. Составить блок-схему алгоритма и программу в соответствии с заданным вариантом.

3. Составить отчет о проделанной работе (аналогично отчету для лабораторной работы №1)

 

Пример выполнения работы

В соревнованиях по фигурному катанию участвуют пары из разных городов. В файле, созданном в текстовом редакторе, имеются следующие записи о каждой паре:

- фамилии, имена партнеров;

- город, откуда прибыла данная пара;

- оценки, полученные в обязательной программе (всего 10 судей, каждый судья выставляет паре по одной оценке).

Подсчитать процент иногородних пар (допустим, что соревнования проходят в городе N).

 

#include<stdlib.h>

#include<string.h>

#include<stdio.h>

#include <windows.h>

#include <wincon.h>

 

#define CB 10 //Число судей

#define MAXLEN 80 //Максимальная длина строки

 

struct Sport

{

char name[MAXLEN];

char town[MAXLEN];

int ball[CB];

};

 

int procent(char* filename, char* twn);

 

 

void main()

{

SetConsoleOutputCP(1251);

int result;

/*Пусть исходные данные для задачи содержатся в текстовом файле data.txt*/

result=procent("data.txt","Moscow");

if(result != -1)

printf("Процент иногородних пар = %d",result);

}

/*

Функция открывает файл с именем filename, считывает из него последовательно записи, вычисляет и возвращает процент иногородних пар (см. условие задачи). Параметр twn – указатель на строку, которая содержит название города, в котором проходят соревнования.

*/

int procent(char* filename, char* twn)

{

FILE* sp; // Указатель на поток

if((sp=fopen(filename,"r"))==NULL)

{

perror("");

return -1;

}

int i;

/*tmp – для считывания одной записи файла:*/

struct Sport tmp;

int count = 0; //Количество иногородних пар

int n = 0; //Количество всех пар-участников

while(1)

{

if(fscanf(sp,"%s%s",tmp.name,tmp.town) == EOF)

break;

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

fscanf(sp,"%d",&tmp.ball[i]);

if (strcmp(tmp.town,twn) != 0)

count++;

n++;

}

fclose(sp);

int pr;

pr=(count*100)/n;

return pr;

}

 

Пример 2

Требуется сохранить массив структурных переменных по шаблону struct Book в двоичном файле.

 

#include"stdio.h"

#include"stdlib.h"

#define LEN 50

 

struct Book

{

char name[LEN];

char title[LEN];

int year;

};

 

void main()

{

 

//Объявляем указатель на открытый поток:

FILE*f;

//Объявляем массив структур с инициализацией:

const int n=4;

struct Book bibl[n]=

{{"Tolstoy", "Voina_and_mir", 1879},

{"Ostrovski", "Groza", 1965},

{"Zolya", "Nana", 1960},

{"Andersen", "Skazki", 1976}};

 

//Открываем файл list.dat для записи в двоичном режиме:

if((f=fopen("list.dat", "wb"))==NULL)

{

perror("Error");

exit(1);

}

int c;

//Записываем данные по шаблону Book в файл:

c=fwrite(bibl, sizeof(struct Book), n, f);

 

//Проверяем успешность записи данных:

if(c==n)

puts("Done.");

else

puts("Error!");

 

//Закрываем файл:

fclose(f);

}

 

 

Задания для самостоятельного выполнения

Обрабатываемый текст программа считывает из файла.

1. Подсчитать количество слов во введенном тексте.

2. Подсчитать количество предложений во введенном тексте.

3. Напечатать в столбик первые слова всех предложений текста.

4. Напечатать в столбик последние слова всех предложений текста.

5. Определить и напечатать слова максимальной длины.

6. Определить и напечатать слова минимальной длины.

7. Определить, в каком по счету предложении впервые встретилось заданное слово.

8. Напечатать предложение, в котором впервые встретилось заданное слово.

9. Напечатать последовательно все двойные буквы (в слове подряд две одинаковых).

10. Подсчитать количество букв, которые встретились в тексте двойными.

11. Напечатать текст, заменив все буквы е на буквы е.

12. Напечатать текст, выпустив все гласные буквы.

13. Напечатать последовательно все встретившиеся в тексте цифры.

14. Подсчитать количество встретившихся в тексте цифр.

15. Проверить правильность написания чисел в тексте. Встретившиеся в начале числа незначащие нули опустить. Исправленный текст напечатать.

16. Прочитать текст построчно справа налево, напечатать.

17. Напечатать текст, выпустив повторяющиеся пробелы между словами.

 

Контрольные вопросы

1. Объяснить, что означают следующие термины: файл, запись, метод

доступа, структура записи?

2. Каково назначение операторов открытия и закрытия файлов на языке

программирования?

3. Допустимы ли различные типы данных для элементов одной записи?

4. Указать, с помощью, каких операторов выполняется запись данных в файл последовательного доступа, чтение из файла?

5. Привести пример использования файлов последовательного доступа.

6. Как распознать конец файла данных?

 


ЛИТЕРАТУРА

1. Березин Б.И., Березин С.Б. Начальный курс С и С++. Москва: ДИАЛОГ-МИФИ, 2010. – 280 с.

2. Джамса К. Учимся программировать на языке С++. Пер. с англ. – М.: Мир, 1997. – 320 с.

3. Паппас К. Х., Мюррей У. Х. III Отладка в C++. Руководство для разработчиков Бином, McGraw-Hill Companies, 2009. – 458 с.

4. Шилдт Г. С++: базовый курс, 3-е издание.: Перевод с англ. – М. : Издательский дом «Вильямс», 2010. – 624 с.

5. Шилдт Г. Искусство программировать на С++. – СПб.: БХВ-Петербург, 2005. -496 с.

6. Бусько В. Л., Навроцкий А.А. Основы алгоритмизации и программирования в среде Visual C++ : лаб. практикум по курсу «Основы алгоритмизации и программирования»- Минск: БГУИР, 2009. – 66с.

 

 


Содержание

ОПРЕДЕЛЕНИЯ, СВОЙСТВА И ОСНОВНЫЕ СТРУКТУРЫ АЛГОРИТМА  
Лабораторная работа № 1. Программирование линейных алгоритмов
Лабораторная работа № 2. Программирование разветвляющихся алгоритмов  
Лабораторная работа № 3. Использование циклов
Лабораторная работа № 4. Составление программ обработки одномерных массивов  
Лабораторная работа № 5. Составление программ обработки двумерных массивов  
Лабораторная работа № 6. Использование пользовательских функций
Лабораторная работа № 7. Указатели. Динамическое управление памятью  
Лабораторная работа № 8. Программирование с использованием строк
Лабораторная работа № 9. Работа со структурами
Лабораторная работа № 10. Работа с файлами
ЛИТЕРАТУРА

 

 


 

 

УЧЕБНОЕ пособие

ПРОГРАММИРОВАНИЕ. ЛАБОРАТОРНЫЙ ПРАКТИКУМ

для студентов направления

230100 – Информатика и вычислительная техника

(Вычислительные машины, комплексы, системы и сети)

 

Лаврухина Тамара Владимировна

 

Редактор Остроухова Г.Н.

Подписано в печать 17.11.11 Формат 60x84 1/16. Бумага офсетная

Ризография. Печ.л. _____ Тираж экз. 100

 

 

Липецкий филиал Международного института компьютерных технологий

398600, Липецк, проезд Кувшинова, 5Б.

Типография ЛФ МИКТ, 398600, Липецк, проезд Кувшинова, 5Б.







Дата добавления: 2014-11-10; просмотров: 1286. Нарушение авторских прав


Рекомендуемые страницы:


Studopedia.info - Студопедия - 2014-2019 год . (0.016 сек.) русская версия | украинская версия