Объясните, пожалуйста, где и в чём ошибки? - C (СИ)
Формулировка задачи:
Сижу битый час, но чтобы я не изменял проблем либо больше, либо ничего не меняется...
Большое спасибо всем, кто откликнется)
Само задание: Описать структуру, содержащую поля: 1.Фамилия, имя. 2.Знак зодиака. 3.Дата рождения (массив из трёх чисел). Написать программу, выполняющую следующие действия: 1.Ввод с клавиатуры данных в массив, состоящий из 8 элементов типа ZNAK; записи должны быть упорядочены по датам рождения; 2. Вывод на экран информации о человеке, чья фамилия введена с клавиатуры. Всю эту структуру нужно вставить в файл и работать с ней.
P.S. Ещё добавил возможность изменения выбранной структуры по фамилии, но что-то и она нормально работать не хочет...
Есть лишние переменные. Просто не успел убрать
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <clocale>
#include <stdlib.h>
int p; int kolichestvo=0;
using namespace std;
struct ZNAK {char NAME[20],ZNAK2[15]; unsigned BDAY[3];}BZNAK[8],T;
void input(FILE *); // создание нового файла
void print(FILE *); // просмотр файла (и сортировка по дате рождения)
void app(FILE *); // добавление в файл
void find(FILE *); // поиск по фамилии и, если необходимо, изменение выбранной структуры
main()
{
setlocale(LC_CTYPE,"Russian");
char c;
FILE *tf;
printf ("Выберете нужный вам режим:\n");
while (1)
{
puts(" 1 – Новый файл");
puts(" 2 – Просмотр файла");
puts(" 3 – Добавление в файл");
puts(" 4 – Поиск по фамилии и изменение");
puts(" 0 - Выход");
c=getch();
switch(c)
{ case '1':input(tf);break;
case '2':print(tf);break;
case '3':app(tf);break;
case '4':find(tf);break;
case '0':return 0;
default : puts(" Неверный режим");
}
}
}
void input(FILE *tf)
{
char ch, Number[15]; int k=0,i=0,j;
tf=fopen("file1.dat","wb");
printf("\n Ввод информации о людях:\n");
do
{
printf("\n Фамилия, имя человека: "); gets(BZNAK[i].NAME);
printf(" Знак зодиака: "); gets(BZNAK[i].ZNAK2);
printf("Знак зодиака: (YYYY MM DD)? ");
for(j=0;j<3;j++)
scanf("%u",&BZNAK[i].BDAY[j]);
gets(Number);
k++;
fwrite(&BZNAK[i],sizeof(BZNAK[i]),i,tf);
i++;
kolichestvo=i;
printf("\n Закончить? y/n \n");
printf("\n");
printf("\n");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}
void print(FILE *tf)
{ int i,j,tg;
tf=fopen("file1.dat","rb");
i=1;
for (i=0;i<kolichestvo;i++)
fread(&BZNAK[i],sizeof(BZNAK[i]),i,tf);
printf ("Записи, упорядоченные по дате рождения:\n");
for(i=0;i<kolichestvo;i++)
for(j=0;j<kolichestvo-i-1;j++)
if((long)1000*BZNAK[j].BDAY[0]+50*BZNAK[j].BDAY[1]+BZNAK[j].BDAY[2]>(long)1000*BZNAK[j+1].BDAY[0]+50*BZNAK[j+1].BDAY[1]+BZNAK[j+1].BDAY[2])
{
T=BZNAK[j];
BZNAK[j]=BZNAK[j+1];
BZNAK[j+1]=T;
}
for(i=0;i<kolichestvo;i++)
{fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
printf("\nИмя: %s \nZЗнак зодиака: %s \nДата рождения: %u %u %u\n\n", BZNAK[i].NAME, BZNAK[i].ZNAK2, BZNAK[i].BDAY[0], BZNAK[i].BDAY[1], BZNAK[i].BDAY[2]);
}
getch();
}
void app(FILE *tf)
{
char ch, Number[15]; int i=kolichestvo,j,k;
tf=fopen("file1.dat","ab");
printf("\n Ввод информации о людях:\n");
do
{
printf("\n Фамилия, имя человека: "); gets(BZNAK[i].NAME);
printf(" Знак зодиака: "); gets(BZNAK[i].ZNAK2);
printf("Дата рождения: (YYYY MM DD)? ");
for(j=0;j<3;j++)
scanf("%u",&BZNAK[i].BDAY[j]);
gets(Number);
k++;
fwrite(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
i++;
kolichestvo=i;
printf("\n Закончить? y/n \n");
printf("\n");
printf("\n");
ch=getch();
}
while (ch != 'y');
fclose(tf);
}
void find(FILE *tf)
{char c='n', tovR[10],Number[15];
long int i=0,j,k=0,tz,yt;
int z;
tf=fopen("file1.dat","rb+");
puts("Введите искомую фамилию: \n");
gets(tovR);
for (i=0;i<kolichestvo;i++)
fread(&BZNAK[i],sizeof(BZNAK[i]),1,tf);
// while (!feof(tf))
//{
z=strlen(tovR);
j=0;
for(i=0;i<kolichestvo;i++)
if(!strncmp(tovR, BZNAK[i].NAME, z))
{
printf("\nИмя: %s \nЗнак зодиака: %s \nДата рождения: %u %u %u\n\n", BZNAK[i].NAME, BZNAK[i].ZNAK2, BZNAK[i].BDAY[0], BZNAK[i].BDAY[1], BZNAK[i].BDAY[2]);
j=1;
yt=i;
};
if(j==0) printf("Нет такой личности!\n\n");
printf ("\n");
else
{
printf("\n Изменить выбранную структуру? y/n ");
c=getch();
}
if (c=='y')
{
printf("\n Фамилия, имя человека: "); gets(BZNAK[yt].NAME);
printf(" Знак зодиака: "); gets(BZNAK[yt].ZNAK2);
printf("Дата рождения: (YYYY MM DD)? ");
for(j=0;j<3;j++)
scanf("%u",&BZNAK[yt].BDAY[j]);
gets(Number);
// k++;
tz=sizeof(BZNAK[yt]);
fseek(tf, -tz, 1);
fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
}
// }
fread(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
fclose(tf);
}Решение задачи: «Объясните, пожалуйста, где и в чём ошибки?»
textual
Листинг программы
for(i=0;i<=yt;i++) //yt - та позиция, на которой найдено совпадение по фамилии
{
tz=sizeof(BZNAK[i]);
h=h+tz;
}
fseek(tf, h, SEEK_SET);
fwrite(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
fread(&BZNAK[yt],sizeof(BZNAK[yt]),1,tf);
Объяснение кода листинга программы
- Переменная
iинициализируется как 0 и принимает значения от 0 доyt. - Переменная
tzиспользуется для хранения размера (в байтах) массиваBZNAK[i]. - Переменная
hиспользуется для хранения суммы размеров всех массивовBZNAK[i]от 0 доyt. - Переменная
tfявляется файловым дескриптором, который, вероятно, ссылается на файл, в который записывается информация. - Вызов
fseek(tf, h, SEEK_SET)используется для перемещения файлового указателя в начало блока данных, который будет записан в файл. - Вызов
fwrite(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf)используется для записи данных из массиваBZNAK[yt]в файл. - Вызов
fread(&BZNAK[yt], sizeof(BZNAK[yt]), 1, tf)используется для чтения данных из файла обратно в массивBZNAK[yt]. Ошибки в коде не указаны. Однако, убедитесь, что:- переменная
ytкорректно инициализирована и содержит действительное значение; - массив
BZNAKинициализирован и содержит действительные данные; - файл
tfкорректно открыт и готов к записи/чтению; - вызовы функций
fseek,fwriteиfreadиспользуются с правильными параметрами и возвращают корректные значения.
- переменная