Пример 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>

/* Чтение массивов */

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. Выполнить для каждой строки матрицы сортировку в порядке уменьшения значений содержащихся в ней чисел. Результаты вычислений записать в новый файл.

 

 



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-27 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: