Постановка задачи
Имеются два массива, содержащие числа типа 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>
/* Чтение массивов */
int load_arrays(FILE* in, double * arr1, double * arr2)
{
int count = 0;
char buf[255];
/* Чтение заголовка таблицы */
fgets(buf, sizeof(buf), in);
while (fgets(buf, sizeof(buf), in)!= NULL)
{
sscanf(buf, "%*d%lf%lf", arr1 + count, arr2 + count);
count++;
}
return count;
}
Пример 4. Вывод содержимого текстового файла на экран дисплея с проверкой на наличие ошибок.
#include<stdio.h>
#include<stdlib.h>
void display_file(FILE* in)
{
char buf[255];
while (fgets(buf, sizeof(buf), in)!= NULL)
{
fgets(buf, sizeof(buf), in);
}
if (ferror(in))
{
printf("Ошибка чтения файла\n");
exit(1);
}
}
Пример 5. Числовая матрица находится в текстовом файле. Первая строка файла содержит данные о размере матрицы. Вычислить сумму элементов в каждой строке матрицы.
#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);
}
}
Пример 6. Сумма чисел в текстовом файле
Постановка задачи
В текстовом файле находятся вещественные числа. Количество строк в файле и количество чисел в строке произвольно. Вычислить сумму чисел, находящихся в файле. Решение задачи оформим в виде функции.
|
Решение
Для вычисления суммы необходимо организовать итерационный цикл. Для чтения чисел можно воспользоваться функцией fscanf(), а для проверки условия нахождения в цикле можно использовать возвращаемое этой функцией значение.
Первый вариант реализации. Обработка ошибок отсутствует
#include<stdio.h>
/* Вычисление суммы чисел в текстовом файле */
double summa_in_text_file(FILE* in)
{
double s = 0;
float x;
while (fscanf(in, "%lf", &x)!= EOF)
{
s += x;
}
return s;
}
Второй вариант реализации. Предусмотрена обработка ошибок чтения.
#include<stdio.h>
#include<stdlib.h>
/* Вычисление суммы чисел в текстовом файле */
double summa_in_text_file(FILE* in)
{
double s = 0;
double x;
int result;
while ((result = fscanf(in, "%lf", &x))!= EOF)
{
if (result!= 1)
{
printf("Ошибка при форматировании прочтенных данных\n");
exit(1);
}
s += x;
}
if (ferror(in))
{
printf("Ошибка при чтении файла\n");
exit(1);
}
return s;
}
Пример 7.
/* Произвольный доступ, двоичный ввод - вывод */
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#define ARSIZE 1000
double readNumber(FILE* in, int index);
int main(void)
{
double numbers[ARSIZE];
double value;
const char* f1 = "numbers.dat";
int i;
long pos;
FILE* in_out;
/* Создаем массив чисел */
for(i = 0; i < ARSIZE; i++)
numbers[i] = i * i;
if((in_out = fopen(f1, "wb")) == NULL)
{
fprintf(stderr, "Невозможно открыть %s для вывода.\n", f1);
exit(1);
}
/* Записываем числа в файл */
fwrite(numbers, sizeof *numbers, sizeof numbers, in_out);
fclose(in_out);
if((in_out = fopen(f1, "rb")) == NULL)
{
fprintf(stderr, "Невозможно открыть %s для произвольного\ ввода.\n", f1);
exit(1);
|
}
/* Считываем выделенные объекты из файла */
printf("Введите индекс в диапазоне 0 - %d.\n", ARSIZE - 1);
scanf("%d", &i);
printf("Значение равно %g.\n", readNumber(in_out, i));
/* while(i >= 0 && i < ARSIZE)
{
pos = (long)i * sizeof * numbers;
fseek(in_out, pos, SEEK_SET);
fread(&value, sizeof *numbers, 1, in_out);
printf("Значение равно %g.\n", value);
printf("Следующий индекс (для выхода укажите индекс, не входящий в диапазон): \n");
scanf("%d", &i);
}
*/
fclose(in_out);
puts("Пока");
getch();
return 0;
}
double readNumber(FILE* in, int index)
{
double value;
long pos;
pos = index * sizeof(double);
fseek(in, pos, SEEK_SET);
fread(&value, sizeof(double), 1, in);
return value;
}
1.11.6. Контрольные вопросы и задачи для самостоятельной работы
1. В чем состоит назначение файлов?
2. В чем состоит отличие файлов от обычных переменных, объявляемых в программе?
3. Какие виды библиотечных функций имеются в языке Си?
4. В чем заключается различие между текстовыми и двоичными потоками?
5. В чем состоит различие между потоком и файлом в языке Си?
6. Каким образом объявляется файловый указатель?
7. Из каких этапов складывается работа с файлами?
8. Может ли текстовый файл использоваться в режиме прямого доступа?
9. В чем состоит назначение процедуры Assign?
10. Может ли текстовый поток быть открыт в режиме ввода – вывода?
11. В каждой строке записано произвольное количество слов. Сформировать новый файл, дописав в конец каждой строки исходного файла ее номер.
12. В конец каждой нечетной строки записать текст четной строки. Результаты вычислений записать в новый файл.
13. Удалить из исходного файла все строки, длина которых не превосходит заданной величины.
14. Поменять местами строки с четными и нечетными номерами. Результаты записать в новый файл.
15. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить произведение содержащихся в ней чисел, а затем выполнить сортировку файла в порядке убывания произведения. Результаты сортировки записать в новый файл.
16. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить сумму положительных чисел, а затем выполнить сортировку файла в порядке возрастания этой суммы. Результаты сортировки записать в новый файл.
17. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить сумму положительных чисел, а затем выполнить сортировку файла в порядке убывания этой суммы. Результаты сортировки записать в новый файл.
18. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить произведение положительных чисел, а затем выполнить сортировку файла в порядке убывания этого произведения. Результаты сортировки записать в новый файл.
19. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить значение медианы, которое затем записать в начало рассматриваемой строки. Результаты записать в новый файл.
20. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить значение медианы, которое затем записать в конец рассматриваемой строки. Результаты записать в новый файл.
21. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить значение медианы. Результаты записать в конец исходного файла.
22. Имеется текстовый файл, содержащий действительные числа. Количество чисел в строке может быть любым. Количество строк не превосходит 100. Для каждой строки вычислить значение медианы. Результаты вычислений записать в новый файл.
23. В файле хранится числовая матрица. В первой строке файла записаны два числа: количество строк и столбцов матрицы, а затем сама матрица. Количество столбцов матрицы не превосходит 10. Выполнить для каждой строки матрицы сортировку в порядке возрастания значений содержащихся в ней чисел. Результаты вычислений записать в новый файл.
24. В файле хранится числовая матрица. В первой строке файла записаны два числа: количество строк и столбцов матрицы, а затем сама матрица. Количество столбцов матрицы не превосходит 10. Выполнить для каждой строки матрицы сортировку в порядке уменьшения значений содержащихся в ней чисел. Результаты вычислений записать в новый файл.