- •Лабораторная работа 11
- •Постановка задачи
- •Варианты заданий
- •Методические указания по выполнению лабораторной работы
- •Справочные материалы
- •Понятие потока
- •Текстовый поток
- •Двоичный поток
- •Файлы в языке си
- •Указатель файла
- •Функция fopen
- •Функция fclose
- •Построчный ввод – вывод
- •Блоковый ввод – вывод
- •Примеры решенных задач
- •Пример 1. Табулирование функции с записью результатов на диск
- •Постановка эадачи
- •Решение
- •Пример 2. Запись содержимого двух массивов в текстовый файл
- •Постановка задачи
- •Решение
- •Пример 3. Чтение из таблицы, хранящейся в файле, двух числовых массивов
- •Постановка задачи
- •Решение
- •Пример 4. Вывод содержимого текстового файла на экран дисплея с проверкой на наличие ошибок.
- •Пример 5. Числовая матрица находится в текстовом файле. Первая строка файла содержит данные о размере матрицы. Вычислить сумму элементов в каждой строке матрицы.
- •Пример 6. Сумма чисел в текстовом файле
- •Пример 7.
- •Контрольные вопросы и задачи для самостоятельной работы
Пример 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;
}