Материал: lectures_3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Решение.

Один из возможных вариантов решения рассматриваемой задачи имеет

следующий вид.

 

/*

Файл 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

133
fseek(),
}
Пример 4. Обработка числовой матрицы, хранящейся на диске Постановка задачи. Числовая матрица находится в текстовом файле.
Первая строка файла содержит данные о размере матрицы. Вычислить сумму элементов в каждой строке матрицы.
Решение
#include<stdio.h>
#include<stdlib.h>
void summa_row_in_text_file(FILE* in, FILE* out)
{ int nrow; int ncol; int row; int col; double s, x;
fscanf(in, "%d%d", &row, &col); for(row = 0; row < nrow; row++)
{
s = 0;
for(col = 0; col < ncol; col++)
{
fscanf(in, "%lf", &x); s += x;
}
fprintf(out, "%10.3f\n", s);
}
}
Прямой доступ к файлу
При использовании прямого доступа к файлу программист имеет возможность оперативно выйти на нужный участок файла, а затем выполнить требуемую операцию. Переход на заданный участок файла осуществляется с помощью функций, выполняющих позиционирование указателя файловой позиции. К таким функциям относятся следующие функции:
count;
}
return
count++;
count);
sscanf(buf, "%*d%lf%lf", arr1 + couПримерnt, arr2 +
int count = 0; char buf[255];
/* Чтение заголовка таблицы */ fgets(buf, sizeof(buf), in);
while(fgets(buf, sizeof(buf), in) != NULL)
{
/* int
{
Чтение массивов load_arrays(FILE* in,

*/ double* arr1, double* arr2)

ftell(),

fgetpos(),

fsetpos().

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

Функция fseek()

#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

Источник: https://studfile.net/preview/16544272/