Название: Информатика.Алгоритмы и программы вычислительных задач микроэлектроники - Метод.(Н.В. Усольцев)

Жанр: Информатика

Просмотров: 886


3. модуль «datafile»

 Для облегчения работы с файлами данных для научно-технических расчетов был создан модуль DataFile, который  содержит свыше 20 функций. Они предназначены для записи и чтения одномерных и двумерных массивов, а также некоторых специальных текстов – функций сплайнов и полиномов и др. Полный список функций приведен во входном комментарии текста программы.

Функции для записи данных WriteVec(), WriteMat(), Write2Vec(), Write3Vec(), WriteFunc() и другие формируют файл данных, который состоит из текстовой строки комментария и набора значений, записываемого в виде одного, двух или трех столбцов. При выводе матриц во второй строке записывается такжк число столбцов матрицы. Симметричные функции ReadVec(), ReadMat(), Read2Vec(), Read3Vec() предназначены для чтения этих данных.

Запись данных массивов в файл осуществляется с помощью функции fprintf(), как показано в листинге 1. Вывод вектора в программе WriteVec() осуществляет следующий фрагмент:

Листинг 5

// запись данных

     fprinf(WorkFile,”\%c”,’;’);

     fprinf(WorkFile,”\%s ”,Remark);

     for (i=n1; i<=n2; i++)

        fprintf(WorkFile,”  \%12.5G ”,X[i]);

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

Чтение данных осуществляется в цикле while, так как нельзя заранее определить число считываемых элементов вектора. Цикл организован следующим образом:

Листинг 6

// чтение данных

     n=0;

     while (feof(WorkFile)==0)

        {

        n++;

        fscanf(WorkFile,”\%lf”,&X[n]);

        }

            n--;

Условием повторения цикла является результат функции feof(), которая возвращает 0, когда достигнут конец файла. Переменная n при этом имеет значение числа считанных элементов +1.

В функциях модуля используется механизм задания значений параметров по умолчанию. Это относится к двум параметрам – имени файла FileName и комментарию Remark. Оба имеют тип string, который определен в модуле define.h как символьный массив.

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

void WrireVec(int n1, int n2, Vector X,

                       string FileName=STRING0, string Rermark=STRING0)

n1 –  номер первой выводимой компоненты вектора;

n2 –  номер последней выводимой компоненты вектора;

X – идентификатор одномерного массива – вектора;

FileName – имя файла, в который осуществляется вывод;

Remark – комментарий к данным, записываемый в файл.

По умолчанию параметрам FileName и Remark присваивается значение «пустой строки», которая определена как константа STRING0 в модуле define.h.

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

Могут быть выполнены следующие обращения к функции:

WrireVec(n1, n2, X);

или

string FileName;

strcpy(FileName,”murka.dat”);

WrireVec(n1, n2, X, FileName, Rermark);

или

string FileName, Remark;

strcpy(FileName,”murka.dat”);

strcpy(Remark,”мой файл”);

WrireVec(n1, n2, X, FileName, Rermark);

 

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

Можно задавать имя файла и комментарий непосредственно в списке параметров

WrireVec(n1, n2, X, “murka.dat”, “мой файл”);

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

Модуль DataFile требует наличия заголовочного файла define.h.