Сделай Сам Свою Работу на 5

ЗАПИСЬ И ЧТЕНИЕ БЛОКОВ ДАННЫХ ИЗ ФАЙЛА

Цель работы:получение практических навыков по записи и чтению блоков данных из файла.

 

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

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

Функция записи блока данных имеет прототип

int fread(void*buf, int bytes, int n, FILE*fptr);

Здесь

buf – указатель на адрес данных, записываемых в файл;

bytes – длина в байтах одной единицы записи (блока данных);

n – число блоков, передаваемых в файл;

fptr – указатель на поток.

Если запись выполнилась благополучно, то функция возвращает число записанных блоков (значение n).

Функция чтения блока данных из файла имеет прототип

int fwrite(void*buf, int bytes, int n, FILE*fptr);

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

# include <stdio.h>

# include <string.h>

void main()

{ FILE *stream;

char msg[ ]=”this is a test”;

char buf[20];

if (( stream=fopen(“DUMMY.FILL”,”w+”))==NULL)

{puts(“Не могу открыть файл \n”); return;}

// Запись строки в файл

fwrite(msg, strlen(msg)+1, 1, stream);

// Установка указателя на начало файла

fseek(stream, 0, SEEK_SET);

// Чтение строки из файла

fread(buf, strlen(msg)+1, 1, stream);

printf(“%s \n”,buf);

fclose(stream);

}

В этой программе поток открывается в режиме w+ (создание для записи с последующим чтением). Поэтому закрывать файл после записи не потребовалось. Новым элементом данной программы по сравнению с предыдущими является использование функции установки указателя потока в заданную позицию. Ее формат

int fseek(указатель_на поток, смещение, начало_отсчета);

Начало отсчета задается одной из констант, определенных в файле stdio.h:

SEEK_SET (имеет значение 0) – начало файла;

SEEK_CUR (имеет значение 1) – текущая позиция;

SEEK_END (имеет значение 2) – конец файла.

Смещение определяет число байт, на которое надо сместить указатель относительно заданного начала отсчета. Смещение может быть как положительным, так и отрицательным числом. Оба параметра имеют тип long.



Форматный обмен с файлами

С помощью функции форматного вывода можно формировать на диске текстовый файл с результатами вычислений, представленными в символьном виде. В дальнейшем этот файл может быть просмотрен на экране, распечатан на принтере, отредактирован с помощью текстового редактора. Общий вид функции форматного вывода:

int fprintf (указатель_на_поток, форматная_строка, список_переменных);

Использовавшаяся нами ранее функция printf () для организации вывода на экран является частным вариантом функции fprintf (). Функция printf () работает лишь со стандартным потоком stdin, который всегда связывается системой с дисплеем. Не будет ошибкой, если в программе вместо printf () написать fprintf (stdin, …).

Правила использования спецификаторов форматов при записи в файлы на диске точно такие же, как и при выводе на экран.

Пример 5.Составим программу, по которой будет рассчитана и записана в файл таблица квадратных корней для целых чисел от 1 до 10. Для контроля эта же таблица выводится на экран.

//Таблица квадратных корней

#include <stdio.h>

#include <iostream.h>

#include <math.h>

voidmain()

{ FILE *fp;

intx;

fp = fopen(“test.dat”, “w”);

//Вывод на экран и в файл шапки таблицы

printf(“\t Таблица квадратных корней \n”);

fprintf(fp, “\t Таблица квадратных корней \n ”);

printf(“\t x\t\tsqrt(x) \n”);

fprintf(fp, “\t x\t\tsqrt(x) \n ”);

\\Вычисление и вывод таблицы квадратных корней

\\на экран и в файл

for(x = 1; x<=10; x++)

{ printf(“\t%f\t%f\n”, float(x), sqrt(float(x)));

fprintf(fp, “\t%f\t%f\n”, float(x), sqrt(float(x)));

}

fclose(fp); }

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

int fscanf(указатель_на_поток, форматная_строка, список_адресов_переменных);

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

В следующем примере числовые данные из файла test.dat, полученного в результате выполнения предыдущей программы, вводятся в числовые массивы x и y. Для контроля значения элементов массивов выводятся на экран. Предварительно с помощью текстового редактора в файле test.dat удаляются две первые строки с заголовками. В результате в файле останутся только числа.

Пример 6.

\\Ввод чисел из файла

#include <stdio.h>

#include <iostream.h>

#include <math.h>

voidmain()

{ FILE *fp;

inti;

floatx [10], y [10];

fp = fopen(“test.dat”,”r”);

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

{ fscanf(fp, “%f%f”, &x[i], &y[i]);

printf(“%f %f\n”, x[i], y[i]);

}

fclose(fp);

}

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

1. Изучить теоретические сведения.

2. Выполнить задание.

Задания для выполнения

1. Набрать и выполнить примеры.

2. Написать аналогичные программы для таблицы умножения целых чисел от 2 до 10.

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

ДОБАВЛЕНИЕ, УДАЛЕНИЕ ДАННЫХ ИЗ ФАЙЛА

Цель работы:получение практических навыков по добавлению и удалению данных из файла.

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

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

#include <stdio.h>

#include <stdlib.h>

struct Sved {

char Fam[30];

double S_Bal;

} zap,zapt;

char Spis[]="c:\\work\\Sp.dat";

FILE *F_zap;

FILE* Open_file(char*, char*);

void main (void)

{

int i, j, kodR, size = sizeof(Sved), kod_read;

while(1) {

puts("Создать – 1\n Добавить– 3\nПросмотреть– 2\nВыход – 0");

scanf("%d",&kodR);

switch(kodR) {

case 1:

case 3:

if(kodR==1) F_zap = Open_file (Spis,"w+");

else F_zap = Open_file (Spis,"a+");

while(2) {

puts("\n Fam (. – end) ");

scanf("%s",zap.Fam);

if((zap.Fam[0])=='.') break;

puts("\n Ball: ");

scanf("%lf",&zap.S_Bal);

fwrite(&zap,size,1,F_zap);

}

fclose(F_zap);

break;

case 2: F_zap = Open_file (Spis,"r+"); int nom=1;

while(2) {

if(!fread(&zap,size, 1, F_zap)) break;

printf(" %2d: %20s %5.2lf\n",

nom++, zap.Fam, zap.S_Bal);

}

fclose(F_zap);

break;

case 0: return; // exit(0);

} // Закрывает switch()

} // Закрывает while()

}

// Функция обработки ошибочной ситуации при открытии файла

FILE* Open_file(char *file, char *kod)

{

FILE *f;

if(!(f = fopen(file, kod))) {

puts("Open File Error!");

exit(1);

}

return f;

}

Советы по программированию

При выполнении вариантов заданий придерживайтесь следующих ключевых моментов.

1. Объекты типов структуры и объединения применяются для логически связанных между собой данных различных типов.

2. После описания шаблона структурного типа данных ставится точка с запятой.

3. Элементы данных, входящие в структуры и объединения, называются полями. Поля могут быть любого базового (стандартного) типа данных, массивом, указателем, объединением или структурой.

4. Для обращения к полю используется операция принадлежности (привязки, выбора) «.» (точка) при обращении через ID структуры, или «–>» (стрелка) при обращении через указатель.

5. Структуры одного типа можно присваивать друг другу с использованием стандартной функции memcpy.

6. Ввод-вывод структур выполняется поэлементно.

7. Структуры, память под которые выделяет компилятор, можно инициализировать значениями их полей.

8. Файл – это именованный объект, хранящий данные на каком-либо носителе, хотя может располагаться и на электронном диске в ОП.

9. Файл не имеет фиксированной длины, т.е. может увеличиваться или уменьшаться в процессе обработки.

10. Перед работой файл необходимо открыть (функция fopen), а после работы закрыть (функция fclose).

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

1. Изучить теоретические сведения.

2. Выполнить задание.

Задания для выполнения

1. Набрать и выполнить пример.

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

 

ЛИТЕРАТУРА

1. Семакин, И. Г., Шестаков А. П. Основы программирования: учебник для сред. Проф. Образования / И.Г. Семакин, А.П. Шестаков. – Издательский центр «Академия», 2003. – 432 с.

2. Шилдт, Г. Самоучитель Си++/ Г. Шилдт. – Санкт-Петербург: БХВ-Петербург, 2004. – 688 с.

3. Батура М. П., Бусько В. Л., Корбит А. Г., Кривоносова Т. М. Основы алгоритмизации и программирования. Язык Си: учеб. пособие / М. П. Батура, В. Л. Бусько, А. Г. Корбит, Т. М. Кривоносова. – 2-е изд. – Минск: БГУИР, 2008. – 240 с.

 

 

 



©2015- 2018 stydopedia.ru Все материалы защищены законодательством РФ.