Лабораторная работа № 4. Работа с файлами на языке С
Файл – это набор данных, размещенный на внешнем носителе и рассматриваемый в процессе обработки как единое целое. Каждый файл завершается маркером конца файла (end-of-file marker или EOF) или указанным числом байтов, записанным в служебную структуру данных.
Задание
| Краткие теоретические сведения
| 1. Выполнить программу, записанную в данном пункте.
Дополнить программу операторами считывания файла и вывода на экран его содержимого.
| Пример программы на языке С, которая открывает файл а.txt на диске f, записывает в него строку символов (слово «привет») и закрывает файл.
Файл открывается с помощью функци fopen, общий вид которой:
fopen(< имя_файла>, < режим_открытия> )
Режимы открытия файла: r- открывает файл для чтения (если файл не существует или его невозможно найти, вызов завершается ошибкой); w- открывает пустой файл для записи (если файл существует, его содержимое удаляется); a- открывает файл для записи в конец файла, создает файл, если он не существует; r+- открывает для чтения и записи существующий файл w+- открывает пустой файл для чтения и записи (если файл существует, его содержимое удаляется); a- открывает файл для чтения и добавления в конец.
В программе примера " w" означает, что файл открывается для записи и, если он существует, то содержимое файла стирается. Если файл не открывается, то в программе выдается сообщение.
Функция fwrite записывает содержимое переменной stдлинойstrlen(st), fp- указатель на файл, в который производится запись.
Файл закрывается с помощью функции fclose.
Чтобы считать информацию можно использовать функцию, общий вид которой:
int fread( void *ptr, int size, int n, FILE *fp);
где void *ptr – указатель на область памяти, в которой размещаются считываемые из файла данные; int size – размер одного считываемого элемента; int n – количество считываемых элементов; FILE *fp – указатель на файл, из которого производится считывание.
В случае успешного считывания информации функция возвращает число прочитанных элементов.
В новых версиях Visual Studioнадо использовать функцию, общий вид которой:
fopen_s( FILE** pFile, const char *filename, const char *mode)
Здесь pFile - указатель на файловый указатель, filename - имя файла, mode - режим открытия файла.
| 2. Выполнить программу, записанную в правой части.
Изменить программу так, чтобы выводились на экран все предложения с 1 по n.
|
Пример. Пусть в текстовом файле “b.txt” на диске f записано несколько предложений. Конец предложения обозначен точкой.
Требуетсч ввести номер предложения n и вывести из текстового файла на экран предложение с этим номером.
В программе на языке С открывается файл, с помощью функции fseekустанавливается текущая позиция в файле на конец и функцией ftellопределяется размер содержимого файла.
Далее с помощью функции fseekустанавливается текущая позиция в файле на начало и происходит чтение информации функцией fread и поиск точки.
| 3. Выполнить программму, приведенную в правой части, несколько раз. Убедиться, что данные, введенные с клавиатуры, записываются в файл с именем base.bin.
Записать условие задачи.
| #include < iostream>
typedef struct studios
{
char fio[16];
char gruppa[3];
} STUD;
int num;
FILE *f;
using namespace std;
void Vvod()
{
STUD buf = {' ', ' '};
f = fopen(" base.bin", " ab" );
for(int p = 0; p < num; p++)
{ cout< < " Фамилия: ";
cin> > buf.fio;
cout< < " Группа: ";
cin> > buf.gruppa;
fwrite(& buf, sizeof(buf), 1, f);
}
fclose(f);
}
void Vyvod()
{
STUD buf;
f = fopen(" base.bin", " rb" );
cout< < " \nФамилия Группа\n";
fread(& buf, sizeof(buf), 1, f);
while(! feof(f))
{
cout< < buf.fio< < " \t " < < buf.gruppa< < endl;
fread(& buf, sizeof(buf), 1, f);
}
cout< < endl;
fclose(f);
}
| void Poisk()
{
int i = 0;
char fam[16];
STUD buf;
f = fopen(" base.bin", " rb" );
cout< < " Введите фамилию: ";
cin> > fam;
while(! feof(f))
{
fread(& buf, sizeof(buf), 1, f);
if(strcmp(fam, buf.fio) == 0)//сравнение строк
{ cout< < " \nФамилия Группа\n";
cout< < buf.fio< < " \t " < < buf.gruppa< < endl;
i = 1;
break;
}
}
fclose(f);
if(i == 0)
cout< < " Ничего не найдено\n";
}
int main ()
{ setlocale(LC_ALL, " Russian" );
int c;
do
{ cout< < " \n1.Ввод данных с клавиатуры и запись в файл\n";
cout< < " 2.Вывод данных из файла\n";
cout< < " 3.Поиск по фамилии\n";
cout< < " 0.Выход из программы\n\n";
cout< < " Введите номер операции: ";
cin> > c;
switch(c)
{ case 1: cout< < " Введите количество студентов: ";
cin> > num;
Vvod(); break;
case 2: Vyvod(); break;
case 3: Poisk(); break;
case 0: exit(0); break;
}
} while (c! = 0);
}
|
|
4. В соответствии со своим вариантом разработать программу для работы с файлами на языке С. В задании использовать бинарные файлы (с расширением bin ).
№ варианта
| Условие задачи
|
| Даны два файла вещественных чисел с именами A и B, содержащие элементы прямоугольных матриц M1 и M2 по строкам, причем начальный элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем C, содержащий произведение матриц M1·M2. Если матрицы M1 и M2 нельзя перемножать, то оставить файл C пустым.
|
| Даны два файла вещественных чисел с именами A и B, содержащие элементы прямоугольных матриц M1 и M2 по строкам, причем начальный элемент каждого файла содержит количество столбцов соответствующей матрицы. Создать файл той же структуры с именем C, содержащий сумму M1+M2.
|
| Дан файл вещественных чисел, содержащий элементы квадратной матрицы (по строкам), причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий транспонированную матрицу.
|
| Дан файл целых чисел с элементами A(i), i = 0, ..., N – 1 (N - размер файла). Заменить исходное расположение его элементов на следующее: A(0), A(N – 1), A(1), A(N – 2), A(2), ....
|
| Компоненты файла A– целые отличные от нуля числа, причем из них первые 10 - положительные числа, затем 10 отрицательных, и т. д. Получить файл B, в котором содержатся сначала 5 положительных чисел, затем 5 отрицательных и т. д.
|
| Даны три файла целых чисел одинакового размера с именами A, B и C. Создать новый файл с именем D, в котором чередовались бы элементы исходных файлов с одним и тем же номером: a0, b0, c0, a1, b1, c1, a2, b2, c2, ....
|
| Компоненты файла A – вещественные числа (положительные и отрицательные). Определить и вывести на экран порядковый номер того из них, которое наиболее близко к введенному пользователем целому числу.
|
| Компоненты файла A – целые числа, значения которых повторяются. Получить файл B, образованный из A числами, которые встречаются в A ровно 2 раза.
|
| Компоненты файла A– целые числа, значения которых повторяются. Получить файл B, образованный из A исключением повторных вхождений одного и того же числа.
|
| Компоненты файла A – целые отличные от нуля числа: х, y1,... yn. Вывести на экран два члена этой последовательности, среднее арифметическое которых ближе всего к х.
|
| Компоненты файла A – целые отличные от нуля числа, причем положительных чисел столько же, сколько отрицательных. Получить файл B, в котором не было бы двух соседних чисел с одинаковым знаком (сохранить порядок следования чисел).
|
| Компоненты файла A – целые числа, значения которых повторяются. Получить файл B, образованный из A числами, которые встречаются в A более 2 раз.
|
| Дан файл вещественных чисел, содержащий элементы квадратной матрицы по строкам, причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ую строку исходной матрицы.
|
| Дан файл вещественных чисел, содержащий элементы квадратной матрицы по строкам, причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ый столбец исходной матрицы.
|
| Дан файл вещественных чисел, содержащий элементы квадратной матрицы по строкам, причем начальный элемент файла содержит значение количества столбцов матрицы. Создать новый файл той же структуры, содержащий k-ый столбец исходной матрицы.
|
| Даны два файла целых чисел с именами A и B. Получить новый файл с именем C, который содержит сумму элементов файлов A и B.
|
5. В соответствии со своим вариантом разработать программу с использованием структуры для работы с данными из таблицы, приведенной ниже.
Реализовать функции ввода, вывода, удаления, поиска элементов. Предусмотреть ввод данных, как с клавиатуры, так и из файла. Вывод данных осуществить как на экран, так и в файл.
№ варианта
| Условие задачи
|
| Преподаватели. Фамилия преподавателя, название экзамена, дата экзамена. Выбор по фамилии.
|
| Вокзал. Номер поезда, пункт назначения, дни следования, время прибытия, время отправления. Выбор по пункту назначения.
|
| Ломбард. База хранимых товаров и недвижимости: анкетные данные клиента, наименование товара, оценочная стоимость; сумма, выданная под залог, дата сдачи, срок хранения. Выбор товаров по наименованию.
|
| Клиенты банка. Ф.И.О., тип счета (срочный, льготный и т. д.), номер счета, сумма на счете, дата последнего изменения. Выбор по номеру счета.
|
| Личная библиотека. Автор книги, название, издательство, раздел библиотеки (специальная литература, хобби, домашнее хозяйство, беллетристика и т. д.), происхождение (покупка, кража, подарок) и наличие книги в данный момент. Выбор книг по автору.
|
| Отдел кадров. Ф.И.О. работника, образование, специальность, подразделение, должность, оклад, дата поступления на предприятие. Выбор по должности.
|
| Склад. Наименование товара, цена, количество, процент торговой надбавки (5, 10, 15, 20, 35, 30). Выбор по наименованию.
|
| Авиарейсы. Номер рейса, пункт назначения, время вылета, дата вылета, стоимость билета, количество мест. Выбор по пункту назначения.
|
| Ученики. Ф.И.О., класс (цифра+буква) предметы, оценки, средний балл. Выбор по фамилии.
|
| Студенты. Ф.И.О., дата поступления, специальность, группа, факультет, средний балл. Выбор по среднему баллу.
|
| Справочник автомобилей. Марка автомобиля, цвет, заводской номер, дата выпуска, тип кузова (седан, универсал и т. п.), дата последнего техосмотра, владелец. Выбор транспортных средств по владельцу.
|
| Записная книжка. Ф.И.О, дата рождения, адрес, телефон, место работы или учебы, должность. Поиск по фамилии.
|
| Государство. Наименование, столица, численность населения, площадь, фамилия президента. Выбор государства по названию.
|
| Список клиентов гостиницы. Паспортные данные, даты приезда и отъезда, номер, тип размещения (люкс, одноместный, двухместный, трехместный, апартаменты). Поиск гостя по фамилии.
|
| Справочник абитуриента. Наименование вуза, адрес, перечень специальностей, конкурс прошлого года по каждой специальности, размер оплаты при договорном обучении. Поиск минимального конкурса по данной специальности.
|
| Горожанин. Ф.И.О., дата рождения, адрес, пол (м, ж). Реализовать выборку по году рождения.
|
В начало практикума
Лабораторная работа № 5. Работа с файлами на языке С++
Для обработки файлов на языке C++ в программу должны быть включены заголовочные файлы < iostream > и < fstream >. Следует также использовать стандартное пространство имен - using namespace std;
Задание
| Краткие теоретические сведения
| 1. В правой части приведен пример программы на языке С++, которая открывает файл (имя которого вместе с расширением нужно ввести с клавиатуры), читает из файла число и возводит его в квадрат.
Затем происходит запись результата вычислений в файл. Предварительно надо записать число в исходный файл.
Выполнить программу, используя различные имена файлов.
| #include < iostream>
#include < fstream>
using namespace std;
double vvodf (ifstream & f, char s[40])
{ double a; f.open (s);
if (f.fail())
{ cout< < " \n Ошибка открытия файла";
exit(1); }//Проверка открытия файла
f > > a; //Чтение переменной
f.close(); return a;
}
void vyvodf(ofstream & f, double a, char s[40])
{ f.open(s);
if (f.fail())
{ cout< < " \n Ошибка открытия файла";
exit(1); }
f < < a; //Запись переменной
f.close();
}
| void main()
{
setlocale(LC_ALL, " Russian" );
double a, b; char str[40];
ifstream f; ofstream f1;
cout< < " \n Ввести имя файла для чтения A: \n";
cin> > str;
a = vvodf(f, str);
cout< < " \n Прочитанное из файла число A=" < < a;
b = pow(a, 2);
cout< < " \n b=" < < b;
cout< < " \n Ввести имя файла для записи A: \n";
cin > > str;
vyvodf(f1, b, str);
cout < < endl;
}
| | 2. Изучить ввод и вывод структур в файл, выполнив программы, записанные в правой части.
Проверить, появился ли файл FIRMA.DAT среди файлов проекта.
| Если программа должна вводить или выводить такие данные, как структуры или массивы, то можно использовать методы readи write.
Пример. Программа слева использует метод write для вывода содержимого структуры с информацией о работнике (фамилия, возраст, зарплата) в файл FIRMA.DAT.
В программе справа используется метод read для чтения из файла информации о служащем.
| 3. Выполнить программу, записанную в данном пункте.
Проверить правильность работы программы.
|
Пример. Пусть дано число k и строковый файл на дискеf с именем Name1, содержащий непустые строки.
Создать два новых файла: строковый с именем Name2, содержащий последние k символов каждой строки исходного файла (если строка короче k символов, то она сохраняется целиком), и символьный с именем Name3, содержащий k-й символ каждой строки (если строка короче k, то в файл Name3 записывается пробел).
| 4. Изучить ввод и вывод структуры, организованной в виде объединения, в файл, выполнив программу, приведенную в правой части.
|
#include < iostream>
#include < fstream>
typedef union telefony
{
char fio[16];
char tel[9];
} FT;
int num;
using namespace std;
void Outpt()
{
ifstream otf(" Tel.DAT" );
cout< < " \nФамилия Телефон\n";
while(! otf.eof())
{
FT buf={' '};
otf.read((char *) & buf, sizeof(buf));
cout< < buf.fio< < " \t ";
otf.read((char *) & buf, sizeof(buf));
cout< < buf.tel< < endl;
}
cout< < endl;
}
void Poisk()
{ ifstream otf(" Tel.DAT" );
int i = 0; char fam[16];
FT buf = {' '};
cout< < " Введите фамилию: "; cin> > fam;
while(! otf.eof())
{ otf.read((char *) & buf, sizeof(buf));
if(strcmp(fam, buf.fio) == 0)//сравнение
{ cout< < " \nФамилия Телефон\n";
cout< < buf.fio< < " \t ";
otf.read((char *) & buf, sizeof(buf));
cout< < buf.tel< < endl;
i = 1; break;
}
}
if(i == 0)
cout< < " Ничего не найдено\n";
}
|
void Inpt()
{
ofstream itf;
itf.open(" Tel.DAT", ios_base:: app);
FT buf = {' '};
for(int p = 0; p < num; p++)
{ cout< < " Фамилия:
cin> > buf.fio;
itf.write((char *) & buf, sizeof(buf));
cout< < " Телефон: ";
cin> > buf.tel;
itf.write((char *) & buf, sizeof(buf));
}
}
int main ()
{ setlocale(LC_ALL, " Russian" ); int c;
do
{ cout< < " \n1.Ввод данных с клавиатуры и запись в файл\n";
cout< < " 2.Вывод данных из файла\n";
cout< < " 3.Поиск по фамилии\n";
cout< < " 0.Выход из программы\n\n";
cout< < " Введите номер операции: ";
cin> > c;
switch(c)
{ case 1: cout< < " Введите количество ";
cin> > num;
Inpt(); break;
case 2: Outpt(); break;
case 3: Poisk(); break;
case 0: exit(0); break;
}
} while (c! = 0);
}
|
|
5. В соответствии со своим вариантом разработать программу для работы с файлами на языке С++. Предварительно создать текстовый файл F1 не менее чем из 10 строк и записать в него информацию.
№ варианта
| Условие задачи
|
| Скопировать в файл F2 только четные строки из F1. Подсчитать размер файлов F1 и F2 (в байтах).
|
| Скопировать в файл F2 только те строки из F1, которые начинаются с буквы «А». Подсчитать количество слов в F2.
|
| Скопировать из файла F1 в файл F2 строки, начиная с К до К+5. Подсчитать количество гласных букв в F2.
|
| Скопировать из файла F1 в файл F2 все строки, которые не содержат цифры. Подсчитать количество строк, которые начинаются на букву «А» в файле F2.
|
| Скопировать из файла F1 в файл F2 строки, начиная с четвертой по порядку. Подсчитать количество символов в последнем слове F2.
|
| Скопировать из файла F1 в файл F2 строки, начиная с N до K. Подсчитать количество согласных букв в файле F2.
|
| Скопировать из файла F1 в файл F2 все строки, которые содержат только одно слово. Найти самое длинное слово в файле F2.
|
| Скопировать из файла F1 в файл F2 все строки, кроме той строки, в которой больше всего гласных букв. Напечатать номер этой строки.
|
| Скопировать из файла F1 в файл F2 все строки, начинающиеся на букву «А», расположенные между строками с номерами N1 и N2. Определить количество слов в первой строке файла F2.
|
| Скопировать из файла F1 в файл F2 все строки, в которых нет слов, совпадающих с первым словом. Определить количество согласных букв в первой строке файла F2.
|
| Скопировать из файла F1 в файл F2 все строки, которые содержат только одно слово. Найти самое короткое слово в файле F2.
|
| Скопировать из файла F1 в файл F2 все строки, в которых есть слова, совпадающие с первым словом. Определить количество согласных букв в последней строке файла F2.
|
| Скопировать из файла F1 в файл F2 все строки, в которых более 2 слов. Определить номер слова, в котором больше всего гласных букв.
|
| Скопировать из файла F1 в файл F2 все строки, в которых содержится два одинаковых слова. Определить номер слова, в котором больше всего букв «А».
|
| Скопировать из файла F1 в файл F2 все строки, в которых содержится не менее двух одинаковых слов. Определить номер слова, в котором больше всего цифр.
|
| Скопировать из файла F1 в файл F2 все строки, в которых есть слова, совпадающие со вторым словом. Определить количество цифр в последней строке файла F2.
|
6. В соответствии со своим вариантом разработать программу с использованием структуры в виде объединения для работы с данными из таблицы, приведенной ниже.
Реализовать функции ввода, вывода, редактирования, удаления, поиска элементов. Предусмотреть ввод данных, как с клавиатуры, так и из файла. Вывод данных осуществить как на экран, так и в файл на языке С++.
№ варианта
| Условие задачи
|
| Преподаватели. Фамилия преподавателя, название экзамена, дата. Выбор по фамилии, дате экзамена.
|
| Вокзал. Номер поезда, пункт назначения, дни следования, время прибытия, время отправления. Выбор по пункту назначения, дате. Вывод расписания по времени.
|
| Ломбард. База товаров и недвижимости: данные клиента, наименование товара, оценочная стоимость; залоговая сумма, дата сдачи, срок хранения. Выбор товаров по истечении срока хранения, по наименованию товара.
|
| Клиенты банка. Ф.И.О., тип счета (срочный, льготный и т. д.), номер счета, сумма на счете, дата последнего изменения. Выбор по номеру счета, по диапазону суммы (< 100, > 100).
|
| Записная книжка. Ф.И.О, дата рождения, адрес, телефон, место работы или учебы, должность. Автоматическое формирование поздравления с днем рождения (по текущей дате). Поиск по фамилии.
|
| Отдел кадров. Ф.И.О. работника, образование, специальность, подразделение, должность, оклад, дата поступления на предприятие. Выбор по должности, стражу работы.
|
| Склад. Наименование товара, цена, количество, процент торговой надбавки (5, 10, 15, 20, 35, 30). Выбор по наименованию, цене. Вывод всего списка товаров на складе с расчетом сумм.
|
| Авиарейсы. Номер рейса, пункт назначения, время вылета, дата вылета, стоимость билета, количество мест. Выбор по пункту назначения, дате вылета.
|
| Ученики. Ф.И.О., класс (цифра+буква) предметы, оценки, средний балл. Выбор по фамилии, выбор по среднему баллу.
|
| Студенты. Ф.И.О., дата поступления, специальность, группа, факультет, средний балл. Выбор по году поступления, фамилии, среднему баллу, группе.
|
| Справочник автомобилей. Марка автомобиля, цвет, заводской номер, дата выпуска, тип кузова (седан, универсал и т. п.), дата последнего техосмотра, владелец. Выбор транспортных средств по владельцу или номеру. Формирование приглашений на техосмотр в соответствии со сроком.
|
| Личная библиотека. Автор книги, название, раздел библиотеки (специальная литература, хобби, домашнее хозяйство, беллетристика и т. д.), происхождение (покупка, кража, подарок) и наличие книги в данный момент. Выбор книг по автору и году, вывод всего списка книг по категориям.
|
| Государство. Наименование, столица, численность населения, площадь, фамилия президента. Выбор государства по названию, занимаемой площади (> заданного значения).
|
| Список клиентов гостиницы. Паспортные данные, даты приезда и отъезда, номер, тип размещения (люкс, одноместный, двухместный, трехместный, апартаменты). Поиск гостя по дате приезда или по фамилии.
|
| Справочник абитуриента. Наименование вуза, адрес, перечень специальностей, конкурс прошлого года по каждой специальности, размер оплаты при договорном обучении. Выбор по разным критериям: все о данном вузе; все о данной специальности, поиск минимального конкурса по данной специальности.
|
| Горожанин. Ф.И.О., дата рождения, адрес, пол (м, ж). Реализовать выборку по полу и году рождения.
|
В начало практикума
Популярное:
|