Решение.
Один из возможных вариантов решения рассматриваемой задачи имеет
следующий вид. |
|
|
/* |
Файл table.c. |
*/ |
#include<stdio.h> |
|
|
#include<conio.h> |
|
|
#include<stdlib.h> |
|
|
void table_file(double xn, double xk, int n, FILE* out); |
||
int |
main(void) |
|
{
int n;
double x1, x2; FILE* out_file;
clrscr();
printf(“Количество расчетных точек = ”); scanf(“%d”, &n);
printf(“Начальное значение аргумента=”); scanf(“%lf”, &x1);
printf(“Конечное значение аргумента=”); scanf(“%lf”, &x2);
if((out_file = fopen(“out_file.txt”, “w”) == NULL))
{
printf(“Не могу открыть файл out_file.txt\n”); exit(1);
}
table_file(x1, x2, n, out_file); fclose(out_file);
printf(“Файл сформирован\n”); getch();
return 0;
}
void table_file(double xn, double xk, int n, FILE* out)
{
double x, dx; int i ;
fprintf(out, “%5s%15s%15s\n”, “Номер”, “Аргумент”,
“Функция”);
dx = (xk - xn) /(n - 1);
x= xn;
for(i = 1; i <= n; i++)
{
fprintf(out, “%5d%15.2f%15.2f\n”, i, x, x * x); x += dx;
}
}
131
Пример 2. Запись содержимого двух массивов в текстовый файл Постановка задачи. Имеются два массива, содержащие числа типа
double. Записать содержимое этих массивов в текстовый файл. Вывод организовать в виде таблицы, снабженной заголовком. Таблица должна содержать три колонки. В первой колонке должен выводиться порядковый номер элемента, в двух других элементы массивов. В заголовке следует указать имена выводимых массивов.
Решение Оформим решение данной задачи в виде функции. Эта функция должна
иметь шесть параметров. Первый из них должен служить для передачи в функцию файлового указателя на файл, в который будет выполняться вывод. Два параметра необходимы для передачи массивов, значения которых следует выводить в файл. Затем еще два параметра необходимы для передачи в функцию имен выводимых массивов. Наконец, последний параметр должен служить для передачи в функцию количества выводимых элементов массива.
#include<stdio.h>
void save_arrays(FILE* out, double* arr1, double* arr2, char* name1, char* name2, int num)
{
int i;
fprinf(out, "%6s%15s%15s\n", "НОМЕР", name1, name2); for(i = 0; i < n; i++)
{
fprinf(out, "%6d%15.2f%15.2f\n", i, arr1[i],
arr2[i]);
}
}
Пример 3. Чтение из таблицы, хранящейся в файле, двух числовых массивов
Постановка задачи. В текстовом файле имеется таблица, в которой хранится содержимое двух массивов. Таблица содержит три колонки и снабжена заголовком, который находится в первой строке файла. В первой колонке представлен порядковый номер элемента, в двух других - элементы массивов.
Оформим решение данной задачи в виде функции. Эта функция должна иметь три параметра. Первый из них должен служить для передачи в функцию файлового указателя на файл, из которого будет выполняться чтение. Два других параметра необходимы для передачи массивов, в которые будет выполняться чтение данных. Количество прочитанных элементов массивов функция должна вернуть в качестве возвращаемого значения. Для чтения файла будет использоваться функция fgets из стандартной библиотеки языка C. Основу алгоритма функции должен составлять итерационный цикл чтения файла. До входа в цикл необходимо прочитать заголовок таблицы, а в его теле последовательно читать строки таблицы. Строка, полученная в
результате чтения заголовка таблицы, в программе не используется.
#include<stdio.h>
132
*/ double* arr1, double* arr2)
∙ftell(),
∙fgetpos(),
∙fsetpos().
Прямой доступ обычно реализуется для двоичных файлов с использованием функций fread() и fwrite().
#include <stdio.h>
int fseek(FILE* stream, long int offset, int whreefrom);
Функция fseek() обеспечивает прямой (произвольный) доступ к открытому потоку. Параметры: stream – файловый указатель, offset – смещение в символах от некоторой точки отсчета и wherefrom – параметр, определяющий точку отсчета. В языке Си определены три символические константы (SEEK_SET, SEEK_CUR и SEEK_END), с помощью которых можно задать точку отсчета wherefrom (см. таблицу, приведенную ниже).
Константа |
Точка отсчета |
SEEK_SET |
Начало файла |
SEEK_END |
Конец файла |
SEEK_CUR |
Текущая позиция в файле |
134