Задача 7.1: Дан бинарный файл, содержащий вещественные числа (тип double). Определить максимальное и минимальное значение в файле и поменять их местами. Имя файла передается в параметрах командной строки.
Программа для задачи
#include <stdio.h> //Библиотека функций ввода и вывода
int main(int argc,char *argv[])
{
//Проверка: передан ли параметр командной строки
if(argc < 2){ //Если нет, то вывод сообщения и выход
puts("Имя файла не указано!");
return 0;
}
FILE *f = NULL; //Объявление файловой переменной
//Открытие файла для чтения и записи с проверкой
if((f = fopen(argv[1],"rb+")) == NULL){
//Если файл открыть не удалось, то
puts("Невозможно открыть файл!");//вывод сообщения
return 0; //и выход
}
double val; //Буфер для чтения данных
//Чтение первого значения из файла
if(fread(&val,sizeof(double),1,f) != 1){
//Если файл пустой, то вывод сообщения и выход
puts("Пустой файл!");
return 0;
}
//Объявление и инициализация апеременных для хранения
//максимального и минимального значений в файле
double max = val, min = val;
//Объявление и инициализация апеременных для хранения
//позиций максимального и минимального значений в файле
//Переменная ind - счетчик текущей позиции в файле
long maxpos = 0, minpos = 0, ind = 1;
while(!feof(f)){ //Пока не конец файла
//Чтение значения из файла
fread(&val,sizeof(double),1,f);
//Если текущий максимум меньше, то
//запоминаем значение и позицию нового максимума
if(max < val) {max = val; maxpos = ind;}
//Если текущий минимум больше, то
//запоминаем значение и позицию нового минимума
if(min > val) {min = val; minpos = ind;}
ind++; //Посчет позиции
}
if(max == min){ //Если максимум равен минимуму
//Вывод сообщения
printf(“Файл содержит одинаковые значения: %lf\n”,max);
}else{ //В противном случае
//Вывод значений
printf("Максимум: %lf\n",max); //максимума
printf("Минимум: %lf\n",min); //минимума
//Установка позиции в файле на позицию максимума
fseek(f,maxpos*sizeof(double),SEEK_SET);
//Запись на позицию максимума значения минимума
fwrite(&min,sizeof(double),1,f);
//Установка позиции в файле на позицию минимума
fseek(f,minpos*sizeof(double),SEEK_SET);
//Запись на позицию минимума значения максимума
fwrite(&max,sizeof(double),1,f);
}
fclose(f); //Закрытие файла
return 0;
}
Задача 7.2: В бинарном файле содержится информация о студентах в виде списка однотипных записей. Каждая запись имеет следующую структуру: ФИО студента (строка 35 символов), курс (целое незнаковое значение от 1 до 5), средний балл (целое незнаковое значение от 1 до 10). Переписать файл, упорядочив список по возрастанию курса, а внутри курса по убыванию среднего балла. Если встречаются записи с одними и теми же курсами и средними баллами, то они упорядочиваются по ФИО в алфавитном порядке. Имя файла передается в параметрах командной строки.
Программа для задачи
#include <stdio.h>//Библиотека функций ввода и вывода
#include <string.h>//Библиотека строковых функций
#include <stdlib.h>//Библиотека стандартных функций
typedef struct{//Описание структуры данных
char fio[36]; //ФИО студента
unsigned kurs, ball; //Курс и средний балл студента
} STUDENT;
//Прототип функции сравнения двух записей
int Cmp(const STUDENT *, const STUDENT *);
int main(int argc, char *argv[])
{
//Проверка: передано ли имя файла в параметрах
if(argc < 2){//Если нет, то
puts("Имя файла не указано!"); //Вывод сообщения
return 0; //Выход
}
FILE *f = NULL; //Объявление файловой переменной
//Открытие файла для чтения и проверка успешности
if((f = fopen(argv[1],"rb")) == NULL){
//Если открыть файл не удалось, то
puts("Невозможно открыть файл!"); //Вывод сообщения
return 0; //Выход
}
fseek(f,0,SEEK_END); //Установка позиции на конец файла
int num = ftell(f); //Чтение размера файла в байтах
fseek(f,0,SEEK_SET); //Возврат к началу файла
Если размер файла не кратен размеру записи, то файл
if(num % sizeof(STUDENT)){//содержит некорректные данные
Задача 7.3: Дан текстовый файл, содержащий строки в следующем формате: КЛЮЧ=ЗНАЧЕНИЕ, где КЛЮЧ - текстовая строка длиной до 8-ми символов, а ЗНАЧЕНИЕ - целое число. Необходимо для каждого ключа создать текстовый файл с именем КЛЮЧ.txt, в который записать все значения с таким ключом. Значения в новых файлах разделяются символом табуляции. Имя исходного файла передается в параметрах командной строки.
Программа для задачи
#include <stdio.h>//Библиотека функций ввода и вывода
#include <string.h>//Библиотека строковых функций
int main(int argc, char *argv[])
{
if(argc < 2){//Если имя файла не передано, то
puts("Не указано имя файла!"); //Вывод сообщения
return 0; //Выход
}
FILE *f = NULL; //Объявление фаловой переменной
//Если открыть файл для чтения не удалось, то
if((f = fopen(argv[1],"r")) == NULL){
puts("Невозможно открыть файл!"); //Вывод сообщения
return 0; //Выход
}
unsigned cnt = 0; //Счетчик строк в файле
while(!feof(f)){ //Цикл: пока не достигнем конца файла
char str[40]; //Буфер для чтения
//Чтение строки, с проверкой на достижение конца файла
if(!ptr){ //Если символ не найден, то вывод сообщения
printf("Некорректная строка %u\n",cnt);
continue; //и переход к следующей строке в файле
}
int len = ptr - str; //Вычисление длины ключа в строке
//Строка для формирования имени файла
char key[15] = "";
strncpy(key,str,len); //Копирование ключа
strcat(key,".txt"); //Добавление расширения файла
//Открытие файла для добавления
FILE *r = fopen(key,"a");
if(r == NULL){//Если открыть файл не удалось,
//то вывод собщения
printf("Невозможно открыть файл %s\n",key);
}else{//В противном случае
fprintf(r,"%s\t",ptr+1); //Запись значения в файл
fclose(r); //Закрытие файла
}
}
fclose(f); //Закрытие исходного файла
return 0;
}
Задача 7.4: Дан текстовый файл, содержащий некоторый текст. Упорядочить слова в каждой строке данного файла в алфавитном порядке. Длина строк в файле не превышает 100 символов, а количество слов в строке - не более 15. Слова в строке разделяются одним или несколькими пробелами. Имя файла передается в параметрах командной строки.
Программа для задачи
#include <stdio.h>//Библиотека функций ввода и вывода
#include <string.h>//Библиотека строковых функций
int main(int argc, char *argv[])
{
if(argc < 2){//Если имя исходного файла отсутствует
puts("Не указано имя файла!"); //Вывод сообщения
return0; //Выход
}
FILE *f = NULL; //Объявление файловой переменной
//Открытие исходного файла для чтения
if((f = fopen(argv[1],"r")) == NULL){//Если не удалось:
puts("Ошибка открытия файла!"); //Вывод сообщения
return 0; //Выход
}
FILE *r = NULL; //Объявление файловой переменной
//Создание результирующего файла для записи
if((r = fopen("temp.txt","w")) == NULL){//Если не удалось
puts("Ошибка создания файла!"); //Вывод сообщения
fclose(f); //Закрытие исходного файла
return 0; //Выход
}
while(!feof(f)){//Цикл: пока не конец исходного файла
char str[101];//Буфер для чтения
//Чтение строки с проверкой на достижение конца файла
fprintf(r,"\n"); //Запись символа перевод строки в файл
}
fclose(f); fclose(r); //Закрытие файлов
remove(argv[1]); //Удаление исходного файла
//Переименование полученного файла в исходный файл
rename("temp.txt",argv[1]);
return 0;
}
Задача 7.5: Дан текстовый файл, содержащий построчно записи о книгах. В каждой записи содержится: фамилия и инициалы автора (строка, до 20 символов), название книги (строка, до 50 символов), год издания (целое положительное значение). Формат записи: ФИО автора “название” год издания. Преобразовать файл в бинарный файл, упорядочив записи по полю фамилии автора, внутри каждой фамилии - по году издания, а внутри года издания - по названию. Имя файла передается в параметрах командной строки. Если имя файла не указано или файл не существует, то ввод осуществляется с клавиатуры. Признак завершения ввода - ввод пустой строки. Имя выходного файла образуется из имени входного файла путем замены расширения на dat. Если ввод осуществляется с клавиатуры, то имя выходного файла - result.dat.
Программа для задачи
#include <stdio.h>//Библиотека функций ввода и вывода
#include <string.h>//Библиотека строковых функций
#include <stdlib.h>//Библиотека стандартных функций
typedef struct{ //Создание структуры для записей
char author[20]; //фамилия и инициалы автора
char title[50]; //название книги
int year; //год издания
} BOOK;
int Input(FILE *, BOOK *); //Функция ввода одной записи
int Add(BOOK **, BOOK, int*);//Функция добавления в список
int Save(FILE *, BOOK *,int);//Функция записи списка в файл