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

Министерство образования Республики Беларусь

Белорусский Национальный Технический Университет

Факультет информационных технологий и робототехники

Кафедра «Программное обеспечение вычислительной техники

и автоматизированных систем»

Отчёт

по лабораторной работе № 4

по дисциплине «Операционные системы»

тема: «Основы файлового ввода-вывода в

Linux: использование стандартной

библиотеки С»

Исполнитель:

студент группы 10702112

Сидоров А.О.

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

Радкевич А.С.

2013-2014 учебный год

ЛАБОРАТОРНАЯ РАБОТА № 4

Основы файлового ввода-вывода в Linux: использование

стандартной библиотеки С

Цель работы

Изучить основные функции ввода-вывода стандартной библиотеки языка

программирования С и закрепить навыки их применения при написании про-

грамм.

Требования

1) С использованием функций стандартной библиотеки С разработать модуль-

ное консольное приложение согласно варианту задания А и В.

2) Для повышения производительности программы использовать функции для

динамического выделения памяти языка программирования С.

3) Для компиляции, компоновки и выполнения программы использовать ути-

литу make, для чего необходимо дополнительно создать make-файл.

4) Для каждой бригады необходимо выполнить задание А полностью и один ва-

риант задания В.

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

1.Понятие буфера, буферизованный и расширенный файловый ввод-вывод?

2. Указатель файл?

3. Функции стандартной библиотеки С для ввода-вывода данных (stdio): fopen

(fdopen), fread, fwrite, fclose (fcloseall), fflush, fseek, fgetc (getc or getchar), fputc

(putc и putchar), fgets, gets?

4. Форматированный ввод-вывод: printf (fprintf и sprintf), scanf (fscanf и sscanf)?

5. Функция стандартной библиотеки С для обработки ошибок файлового ввода-

вывода и функция определения конца файла?

Индивидуальное задание:

Задание A

Расширить программу, разработанную при выполнении лабораторной работы № 3, функционалом, который бы позволял читать размерность и содержимое матрицы из одного файла, а также выводить конечные результаты в

другой файл. Входной файл должен содержать совокупность строк. Строка

файла содержит строку матрицы. Предусмотреть как ручное создание файла

и его заполнение, так и генерацию файла в автоматическом режиме.

Задание B

В программе необходимо определить структура сущностей согласно варианту

бригады (разрешается придумать свою структуру-сущность, предварительно

согласовав её с преподавателем). Затем объявить два массива данного типа и

инициализировать один из них соответствующими данными (массивы

должны быть созданы динамически). Далее программа должна предоставлять

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

в другой массив. В программе дополнительно предусмотреть возможность

для манипуляции списка сущностей соответствующей предметной области (к

примеру, отсортировать список по заданному критерию, осуществить необходимы поиск и т.д.).

Phone: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Дебет,Кредит, Время городских и междугородных разговоров.

Ход выполнения лабораторной работы:

  1. В текстовом редакторе gedit набрал исходный код решения задания на языке программирования С и сохранил исходник. Программа состоит из следующих файлов:

    • function.h файл заголовка, в котором описаны прототипы функций.

    • function.cc файл реализации функций;

    • test.cc файл, в котором описана главная функция программы main;

  1. В папке с программой создал make-файл.

  2. Запустил терминал Linux и с помощью команды cd перешёл в папку местонахождения исходных кодов программы.

  3. Для компиляции программы использовал утилиту make и созданный make-файл.

Результаты выполнения лабораторной работы:

Рисунок 1 — Использование утилиты make

Рисунок 2 — Выполнение программы

Что я освоил в процессе выполнения лабораторной работы:

  1. Научился использовать функции для динамического выделения памяти языка программирования С, такие как:

malloc() возвращает указатель на первый байт области памяти размером size, которая была выделена из динамически распределяемой области памяти.

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

fopen - открывает файл, имя которого задается параметром , и возвращает указатель на поток, связанный с этим файлом.

fclose() закрывает файл, связанный с потоком stream, и дозаписывает его буфер.

fgets() читает из входного потока stream не более num-1 символов и помещает их в массив символов, адресуемый указателем str.

fputs() записывает в заданный поток stream содержимое строки, адресуемой указателем str.

fscanf() работает подобно функции scanf(), но читает информацию не из стандартного потока ввода stdin, а из потока, заданного указателем stream.

fprintf() выводит в поток, адресуемый параметром stream, значения аргументов, составляющих список аргументов, в соответствии с заданной строкой формата format.

Выводы:

  1. Для повышения производительности программы используются функции длядинамического выделения памяти.

  2. Функциями стандартной библиотеки С для ввода-вывода данных являются: fopen,fread, fwrite, fclose, fflush, fseek, fgetc, fputc, fgets, fprintf , fscanf.

ПРИЛОЖЕНИЕ A

Листинг исходного кода программы

Файл functions.h

#ifndef function_H

#define function_H

int polz(int **a,int N,int M);

void print(int **a, int n, int m);

int generator(int **a,int N,int M);

bool LocalMinimum(int **a, int x, int y, int maxX, int maxY);

void find(int **a, int maxX, int maxY);

void file(int **p,int N,int M);

#endif

Файл functions.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include "function.h"

using namespace std;

void file(int **p,int N,int M)

{

FILE *out;

if ((out = fopen("file.out", "w"))==NULL) {

printf("He удается открыть файл.\n");

exit(1);

}

fprintf(out,"%d %d\n",N,M);

for(int i=0;i<N;i++)

{

for(int j=0;j<M;j++)

{

fprintf(out,"%d ",p[i][j]);

}

fprintf(out,"\n");

}

fclose(out);

}

int polz(int **a,int N,int M)

{

int i,j;

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

for (j=0; j<M; j++)

{

cin>>a[i][j];

}

return 0;

}

void print(int **a, int n, int m)

{

int i, j;

cout << "Матрица:" << endl;

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

{

for(j = 0; j < m; j++)

cout << a[i][j] << " ";

cout << endl;

}

}

int generator(int **a,int N,int M)

{

int i,j,m;

srand(time(NULL));

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

for (j=0; j<M; j++){

m = 0 + rand() % 100;

a[i][j]=m;

}

return 0;

}

bool LocalMinimum(int **a, int x, int y, int maxX, int maxY)

{

int i,j,l=0,value=a[x][y];

if (x==0||y==0||x==maxX-1||y==maxY-1) {return false;}

for (i=x-1; i<x+2; i++)

for (j=y-1; j<y+2; j++)

if (value>=a[i][j]){l++;}

l--;

if (l>0) {return false;} else return true;

}

void find(int **a, int maxX, int maxY)

{

int count=0,o[maxX*maxY],i=0,max=0;

for(int x=0;x<maxX;x++)

for(int y=0;y<maxY;y++)

if(LocalMinimum(a, x, y, maxX, maxY))

{

o[i]=a[x][y];

i++;

cout<<"Локальный минимум "<<a[x][y]<<" -> ("<<x+1<<","<<y+1<<")"<<endl;

count++;

}

cout<<"Количество локальных минимумов "<<count<<endl;

count++;

if (i>1){

if (max<o[0]){max=o[0];}

for (int j=0;j<i-1;j++)

if (max<o[j+1])

max=o[j+1];

cout<<"Максимум из локальных минимумов "<<max<<endl<<endl;}

else if (i==1){

cout<<"Максимум из локальных минимумов "<<o[0]<<endl;}

else cout<<"Максимум из локальных минимумов 0"<<endl<<endl;

}

Файл test.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include "function.h"

using namespace std;

int main()

{

int i,M,N,**g,**p,**k;

char ch;

FILE *in;

cout<<"1-Инициализировать матрицу с помощью генератора случайных чисел"<<"\n";

cout<<"2-Инициализировать матрицу с помощью пользовательского ввода"<<"\n";

cout<<"3-Заполнить матрицу из файла"<<"\n";

cout<<"0-Выход"<<"\n";

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

do {

ch = getchar();

switch(ch)

{

case '1' :

cout<<"Введите размер матрицы"<<"\n";

cout<<"Количество строк:";

cin>>N;

cout<<"Количество столбцов:";

cin>>M;

cout<<endl;

g=new int *[N];

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

g[i]=new int [M];

generator(g,N,M);

print(g,N,M);

find(g, N, M);

file(g,N,M);

delete g;

break;

case '2' :

cout<<"Введите размер матрицы"<<"\n";

cout<<"Количество строк:";

cin>>N;

cout<<"Количество столбцов:";

cin>>M;

cout<<endl;

p=new int *[N];

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

p[i]=new int [M];

polz(p,N,M);

print(p,N,M);

find(p, N, M) ;

file(p,N,M);

delete p;

break;

case '3' :

if((in=fopen("file.in", "r"))==NULL) {

printf("He удается открыть файл.\n");

exit(1);

}

fscanf(in,"%d%d",&N,&M);

k=(int **)malloc(N*sizeof(int*));

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

k[i]=(int *)malloc(M*sizeof(int));

for(int i=0;i<N;i++)

{

for(int j=0;j<M;j++)

{

fscanf(in,"%d",&k[i][j]);

}

}

print(k,N,M);

find(k,N,M);

fclose(in);

free(k); }

}

while(ch!='0');

return 0;

}

Файл Makefile

test: test.o function.o

g++ test.o function.o -o test

test.o: test.cc function.h

g++ -c test.cc

function.o: function.cc function.h

g++ -c function.cc

ПРИЛОЖЕНИЕ B

Листинг исходного кода программы

Файл functions.h

#ifndef function_H

#define function_H

struct Phone

{int id,nomer,kredit,vremmeg,vremgor,debet;

char im[15],fam[15],otch[15],adress[30];};

void file(Phone *obj);

void file1(Phone *obj);

void zap(Phone *obj);

void sort(Phone *obj,Phone p);

void poisk(Phone *obj);

void vivod();

#endif

Файл functions.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include "function.h"

using namespace std;

void file(Phone *obj)

{

FILE *out;

if ((out = fopen("Phone.out", "w"))==NULL) {

printf("He удается открыть файл.\n");

exit(1);

}

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

fprintf(out,"%d %d %d %d %d %d %s %s %s\n",obj[i].id,obj[i].nomer,

obj[i].kredit,obj[i].vremmeg,obj[i].vremgor,obj[i].debet,obj[i].im,

obj[i].fam,obj[i].otch,obj[i].adress);

fputs(obj[i].adress,out);

fprintf(out,"\n");

}

fclose(out);

}

void file1(Phone *obj)

{

FILE *out;

if((out=fopen("Phone.out", "r"))==NULL) {

printf("He удается открыть файл.\n");

exit(1);

}

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

fscanf(out,"%d %d %d %d %d %d %s %s %s\n",&obj[i].id,&obj[i].nomer,

&obj[i].kredit,&obj[i].vremmeg,&obj[i].vremgor,&obj[i].debet,obj[i].im,

obj[i].fam,obj[i].otch);

fgets(obj[i].adress,28,out);}

fclose(out);

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

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

}

}

void zap(Phone *obj)

{

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

cout<<"id: ";cin>>obj[i].id;

cout<<"Номер кредитной карточки: ";cin>>obj[i].nomer;

cout<<"Кредит: ";cin>>obj[i].kredit;

cout<<"Время междугородных разговоров: ";cin>>obj[i].vremmeg;

cout<<"Время городских разговоров: ";cin>>obj[i].vremgor;

cout<<"Дебет: ";cin>>obj[i].debet;

cin.getline(obj[i].im,0);

cout<<"Имя: "; cin.getline(obj[i].im,15);

cout<<"Фамилия: ";cin.getline(obj[i].fam,15);

cout<<"Отчество: ";cin.getline(obj[i].otch,15);

cout<<"Адрес: ";cin.getline(obj[i].adress,30);

}

}

void sort(Phone *obj,Phone p)

{

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

{for (int j=i+1; j<4; j++)

{

if (obj[i].id>obj[j].id)

{

p = obj[i];

obj[i] = obj[j];

obj[j] = p;

}

}

}

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

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

}

}

void poisk(Phone *obj)

{

int k,m=0;

cout<<"Введите нужный id: ";

cin>>k;

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

{

if (obj[i].id==k)

{

cout<<"id: "<<obj[i].id<<endl;

cout<<"Номер кредитной карточки: "<<obj[i].nomer<<endl;

cout<<"Кредит: "<<obj[i].kredit<<endl;

cout<<"Время междугородных разговоров: "<<obj[i].vremmeg<<endl;

cout<<"Время городских разговоров: "<<obj[i].vremgor<<endl;

cout<<"Дебет: "<<obj[i].debet<<endl;

cout<<"Имя: "<<obj[i].im<<endl;

cout<<"Фамилия: "<<obj[i].fam<<endl;

cout<<"Отчество: "<<obj[i].otch<<endl;

cout<<"Адрес: "<<obj[i].adress<<endl;

m++;

}

}

if (m==0){cout<<"Структура не найдена!"<<endl<<endl;}

}

void vivod()

{

cout<<"1-Заполнить 1 масив"<<"\n";

cout<<"2-Записать данные в файл"<<"\n";

cout<<"3-Заполнить 2 массив из файла"<<"\n";

cout<<"4-Отсортировать 2 массив по id"<<"\n";

cout<<"5-Поиск структуры во 2 массиве по id"<<"\n";

cout<<"0-Выход"<<"\n";

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

}

Файл test.cc

#include <stdio.h>

#include <iostream>

#include <stdlib.h>

#include "function.h"

using namespace std;

Phone *obj = (Phone*)malloc(3*sizeof(Phone));

Phone *obj1 = (Phone*)malloc(3*sizeof(Phone));

Phone p;

int main()

{

char ch;

FILE *out;

vivod();

do {

ch = getchar();

switch(ch)

{

case '1' : zap(obj);vivod();break;

case '2' : file(obj);vivod();break;

case '3' : file1(obj1);vivod();break;

case '4': sort(obj1,p);vivod();break;

case '5': poisk(obj1);vivod();break;

}

}

while(ch!='0');

return 0;

}

Файл Makefile

test: test.o function.o

g++ test.o function.o -o test

test.o: test.cc function.h

g++ -c test.cc

function.o: function.cc function.h

g++ -c function.cc

Соседние файлы в папке Сидоров А.О