Стоит задача: ПО ВВОДИМОЙ С КЛАВИАТУРЫ ФАМИЛИИ АБОНЕНТА ВЫДАЕТСЯ ИНФОРМАЦИЯ О ВСЕХ ИМЕЮЩИХСЯ НОМЕРАХ ТЕЛЕФОНОВ (СОРТИРОВКА ПО ГОДУ УСТАНОВКИ). Задача, вроде, даже выполняется, но перед этим выводится на экран куча разной ерунды. Помогите исправить, пожалуйста.
Код:
//Создать файл, содержащий сведения о телефонах абонентов.
//Каждая запись имеет поля: фамилия абонентов, год установки телефона, номер телефона.
//На печать вывести информацию следующего вида: ПО ВВОДИМОЙ С КЛАВИАТУРЫ ФАМИЛИИ АБОНЕНТА
//ВЫДАЕТСЯ ИНФОРМАЦИЯ О ВСЕХ ИМЕЮЩИХСЯ НОМЕРАХ ТЕЛЕФОНОВ (СОРТИРОВКА ПО ГОДУ УСТАНОВКИ),
//ОПРЕДЕЛЯЕТСЯ КОЛИЧЕСТВО УСТАНОВЛЕННЫХ ТЕЛЕФОНОВ С XXXX ГОДА (ГОД ВВОДИТСЯ С КЛАВИАТУРЫ).
//Создать программу (выполнив функциональное разбиение),
//реализующую следующие функции работы с бинарным файлом.
//Предусмотреть создание меню со следующими пунктами:
//1 – СОЗДАНИЕ НОВОГО ФАЙЛА
//2– ПРОСМОТР ФАЙЛА
//3 – КОРРЕКТИРОВКА ЗАПИСЕЙ ФАЙЛА (изменение, добавление новой записи, удаление записи)
//4 – ВЫПОЛНЕНИЕ ЗАДАЧИ
//5 – ВЫХОД
#include <stdio.h> //содержит стандартные функции файлового ввода-вывода
#include <io.h> //для работы с файлами
#include <conio.h> // функции для работы с консолью
#include <process.h> //для очистки экрана
#include <locale.h> // подключение setlocale
#include <malloc.h> // Функции для манипулирования динамической памятью
#include <string.h> // для работы со строками
#include <fcntl.h.> //работы с функциями дискриптора
#include <stdlib.h>
void A();
void B();
void C();
typedef struct zap{
char fam[50];
char tl[10];
int year;
} zp;
zp a;
int cmp(const void* p1, const void* p2)
{
if(strcmp( ((zap*)p1)->tl, ((zap*)p2)->tl )>0)
return 1;
if(strcmp( ((zap*)p1)->tl, ((zap*)p2)->tl )<0)
return -1;
if(strcmp( ((zap*)p1)->tl, ((zap*)p2)->tl )==0)
return (((zap*)p1)->year-((zap*)p2)->year);
}
void A() {
setlocale(LC_CTYPE, "Russian");
int i,n;
FILE *f;
printf("Введите количество вводимых абонентов: ");
scanf("%d",&n);
f=fopen("g:\\fl01.bin","wb");
for(i=0;i<n;i++)
{
printf("Vvedite fam %d-ogo cheloveka:",i+1);
scanf("%s",&a.fam);
printf("Vvedite year ystanovki:",i+1);
scanf("%d",&a.year);
printf("Vvedite number %d-ogo cheloveka:",i+1);
scanf("%s",&a.tl);
fwrite(&a, sizeof(a),1,f);
}
printf("Vvod dannix zaver6en\n");
fclose(f);
}
void B() {
FILE *f;
if(!(f=fopen("g:\\fl01.bin", "rb")))
{ printf("Open file failed.\n");
exit(0); }
while(fread(&a, sizeof(a),1,f))
{ if(feof(f)) break;
printf("\n Фамилия=%s Телефон=%s Год=%d\n", a.fam, a.tl, a.year); }
fclose(f);
}
//int C() {}
void D() {
zap report[100];
int count=1;
zap buffer[250];
char abonent[12];
FILE *in;
if(!(in=fopen("g:\\fl01.bin", "rb")))
{
printf("Ошибка открытия файла.\n");
exit(0);
}
printf("\nВведите фамилию абонента: ");
scanf("%s", &abonent);
while(fread(buffer, sizeof(zap),1,in))
{
if(feof(in)) break;
printf("\n Фамилия абонента=%s Номер телефона=%s Год установки=%d", (*(report+count)).fam, (*(report+count)).tl, (*(report+count)).year);
if (strcmp(abonent,buffer->fam)==0)
{
count++;
memmove(&report[count],buffer,sizeof(zap));
}
}
fclose(in);
qsort(report,count,sizeof(zap),cmp);
int counter=0;
int i;
FILE *out;
out=fopen("fl01.bin", "wb");
for(i=0; i<count;++i)
{
fwrite(report+i, sizeof(zap),1,out); //Пишем запись в файл
}
fclose(out);
}
void main()
{
int n;
setlocale(LC_CTYPE,"Russian");
puts("\nВведите номер функции: 1 – СОЗДАНИЕ НОВОГО ФАЙЛА;");
puts("\n 2 – ПРОСМОТР ФАЙЛА;");
puts("\n 3 – КОРРЕКТИРОВКА ЗАПИСЕЙ ФАЙЛА (изменение, добавление новой записи, удаление записи);");
puts("\n 4 – ВЫПОЛНЕНИЕ ЗАДАЧИ;");
puts("\n 5 – ВЫХОД. ");
scanf_s("%d", &n);
switch(n) {
case 1: A(); break;
case 2: B(); break;
//case 3: C(); break;
case 4: D(); break;
case 5: break;
}
_getch();
}