Студопедия

КАТЕГОРИИ:

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

Struct students fill( students sv)




{

fflush(stdin);

puts(“Имя студента?”);

gets(sv.name);

puts(“Возраст студента?”);

scanf(“%d”, sv.age);

puts(“Средний балл?”);

scanf(“%f”, sv.average);

return (sv);

}

Void pr (students sv)

{

puts(“Имя студента:”);

puts(cv.name);

puts(“Возраст студента:”);

printf (“%d\n”, sv.age);

puts(“Средний балл:”);

printf (“%f\n”, sv.average);

}

Main()

{

struct students sv1, sv2;

sv1=fill(sv1);

sv2=fill(sv2);

puts(“Вот информация о студентах:”);

pr(sv1);

pr(sv2);

}

Из определения функции fill следует, что она должна возвращать значение, тип которого представляет собой struct students, и имеет один аргумент такого же типа. Две локальные переменные такого типа sv1 и sv2 объявляются в main(), а затем передаются в функцию fill() по значению, и изменения, которые происходят с ними в fill(), в main() не видны. Поэтому эти переменные нужно вернуть в вызывающую функцию.

 

Задание:

Задать структуру, определяющую работника для отдела кадров. Хранить поля: ФИО, год рождения, пол, оклад. Создать функцию, которая получает структурную переменную в качестве параметра и определяет размер пенсии работника (80% от оклада), если в текущем году он достиг пенсионного возраста (55 лет для женщин и 60 лет для мужчин).

 

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

1. Как правильно передать структурную переменную в функцию?

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

 


Лабораторная работа №25

 

Использование файлов в программе на C.
Функции fopen() и fclose()

Цель работы: научиться работать с файлами в программе на Cи.

 



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

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

Для того, чтобы производить какие-либо операции с файлом, его надо открыть. Это производиться с помощью функции fopen. Ее описание выглядит так:

FILE * fopen(char *path, char *mode);

Функция fopen принимает два параметра: path и mode:

path – имя открываемого файла;

mode – режим открытия файла.

Функция, получив необходимые параметры, производит открытие файла и заполняет поля структурной переменной типа FILE, указатель на которую она и возвращает. При этом эта функция производит самостоятельное выделение необходимого количества памяти под переменную. Так как чтение и запись происходят с определенной позиции, функция fopen модифицирует значение этой позиции в соответствии с режимом открытия. Если открытие файла не произошло по какой-либо причине, то функция fopen возвращает 0. Поэтому после ее вызова необходима проверка на успешное открытие файла.

Фрагмент кода, выполняющий открытие файла, будет иметь вид:

FILE *fl; // указатель на файловую переменную.

fl=fopen("somef.dat","w+"); // открытие файла somef.dat для чтения и записи

if(fl==0)

     {

     printf("\nПроизошла ошибка открытия файла somef.dat");

     return;

     }

Файл может быть открыт в следующих режимах:

r - открыть только для чтения. Позиция, с которой будет производиться чтение, устанавливается на начало файла.

w - создать для записи. Позиционирование на начало файла. Если файл существует, он будет переписан.

a - добавление. Открытие для записи в конец файла. Создание, если файл не существовал.

r+ -открытие существующего файла для изменения (и чтение, и запись)

w+ - создание нового для чтения и записи. Если файл существует, он будет дописан.

a+ - идентично a.

Кроме того, файл может быть открыт в текстовом и двоичном режиме - это устанавливается добавлением к параметрам в строке mode следующих букв: t-текстовый режим , b-двоичный режим. Например, строка mode может иметь вид: "rt" или "wt+", "w+t", "ab", и т.д.

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

int fputc(int byte, FILE *stream);

Запись байта byte в файл stream. Если файл был открыт для только чтения, то функция fputc не произведет записи в файл. Если запись не была успешной, то fputc возвращает EOF. Фрагмент программы, выполняющей запись байта в файл:

int c=90;

// fl - ранее успешно открытый файл

if (fputc (c, fl)==EOF)

{

printf("Невозможно записать файл");

}

Когда требуется запись в файл строки, побайтовая запись оказывается невыгодной, для этого существует функция: fwrite.

size_t fwrite(void *ptr, size_t size, size_t n,FILE *stream);

ptr - указатель на данные которые необходимо записать;

size - длина одной единицы данных;

n - количество единиц данных;

stream – файл, в который производится запись.

Функция fwrite записывает в файл streamn единиц данных, каждая из которых имеет длину size, данные берутся по указателю ptr. Возвращается количество действительно записанных единиц.

Фрагмент программы, выполняющий запись в файл массива int длиной 10:

int array[10];

for(int c=0;c<10;c++) array[c]=c;

// fl- заранее открытый файл

if(fwrite(array,sizeof(int),10,fl)!=10)

{

printf("\nВо время записи произошла ошибка");

};

// Можно также записать так

//if(fwrite(array,sizeof(int)*10,1,fl)!=10)

Иногда целесообразно использовать функцию fprintf.

int fprintf(FILE *stream, char *format, ...);

Ее действия полностью аналогичны действиям функции printf, с тем отличием, что printf выводит данные на экран, а fprintf в заданный параметром stream файл. Задание значений всех параметров, кроме значения stream, функции fprintf аналогично заданию значений параметров функции printf. В результате записи значение позиции в файле изменяется на количество записанных байт.

Для чтения одного байта из файла можно использовать функцию: fgetc.

int fgetc(FILE *stream);

Эта функция читает байт из файла stream, и возвращает его. Позиция чтения сдвигается на 1. В случае ошибки чтения возвращается EOF.

int c;

// fl - заранее открытый файл

if((c=fgetc(fl))==EOF)

{

printf("Чего-то не читается");

return;

}

Else

{

printf("Прочитан байт – значение:%d",c);

}

Чтобы прочитать последовательность байт используется функция fread().

size_t fread(void *ptr, size_t size, size_t n,FILE *stream);

fread читает из файла streamn единиц данных, длиной size каждая, данные помещаются в память, начиная с адреса, сохраненного в указателе ptr. Функция не выделяет память под данные, потому ответственность за их размещение в памяти ложится на пользователя.

После работы с файлом он должен быть закрыт. Это осуществляет функция fclose(FILE *). Для закрытия файла надо вызвать функцию fclose, параметром передать указатель на файловую переменную. После закрытия любые операции чтения/записи станут невозможны до следующего открытия.

 

Задание:

1. Написать программу, производящую запись в файл с именем, заданным пользователем, массива типа int заданной длины, инициализированного пользователем.

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

 

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

1. Какая функция производит открытие файла, ее параметры?

2. Какая функция производит закрытие файла, ее параметры?

3. Какие существуют режимы открытия файла?

4. Какие существуют функции записи?

5. Какие существуют функции чтения?

 


 

Лабораторная работа №26

 


Использование имени файла в качестве параметра командной строки

 

Цель работы: научиться получать и обрабатывать параметры командной строки

 

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

В операционной системе МS DOS существует возможность запуска исполняемой программы с одним или несколькими параметрами. Каждый из этих параметров записывается после имени исполняемого файла. Все они разделяются пробелами. Например:

Format a: /s

В данном случае программе format передаются два параметра: “a:” и /s”.

Язык программирования С позволяет получать и обрабатывать переданные в программу параметры. Для этого функция main() должна быть описана следующим образом (идентификаторы переменных могут быть другими):

[тип возвращаемого значения] main(int argc, char **argv);

где int argc – количество параметров, char **argv – указатель на строки, содержащие эти параметры. Следует отметить, что первым параметром всегда является полное имя исполняемого файла, к которому принадлежит функция main. Например, для приведенного выше вызова программы formatпеременные будут иметь следующие значения: argc=3, *argv=”c:\dos\format.com”, *(argv+1)=”a:”, *(argv+2)=”/s” (путь к format.com может отличаться от приведенного).

Работа с параметрами функции main() ведется точно так же, как и с обычными параметрами функций языка С.

Очень часто параметром программы является имя файла. Например:

Edit autoexec.bat

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

 

Задание:










Последнее изменение этой страницы: 2018-05-10; просмотров: 224.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...