Привет, ребята! Помогите, пожалуйста разобраться с задачей: нужно добавить функцию, которая бы сохраняла существующие записи в файл, и функцию, которая загружала бы эти записи обратно в программу. Что-то никак не могу сообразить как это сделать( Заранее большое спасибо!!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct zv_koordinati
{
double ugol;
int chas, min; /* координаты на небосклоне (15° 23 ч 27 мин) */
};
struct rasdozamli
{
double ras;
int godkm; /* расстояние до Земли ( в св. годах или в км) */
};
struct zvezda
{
char zv_name[20]; /* название (Солнце) */
double zv_velichina; /* видимая величина (-26,74) */
struct zv_koordinati k;
struct rasdozamli l;
};
void vivodinfo(const struct zvezda *p)
{
printf("Название звезды: \t %s \n", p -> zv_name);
printf("Видимая величина: \t %lg \n", p -> zv_velichina);
printf("Расстояние до Земли: \t %lg %s \n", p -> l.ras, (p -> l.godkm ? "св.лет" : "км"));
printf("Координаты на небосклоне: \t %lg° %d ч %d мин \n\n", p -> k.ugol, p -> k.chas, p -> k.min);
}
void vvodzvkoordinati(const struct zv_koordinati *p)
{
fflush(stdin);
printf("\nУгол:\t");
scanf("%lg", &p->ugol);
while (p->ugol < -90 || p->ugol > 90) {
printf("\nОшибка. Введите угол ещё раз (от -90 до 90)!\n");
printf("\nУгол:\t");
fflush(stdin);
scanf("%lg", &p->ugol);
}
fflush(stdin);
printf("Часы:\t");
scanf("%d", &p->chas);
while (p->chas < 0 || p->chas > 23) {
printf("\nОшибка. Введите часы ещё раз (формат - 24 часа)!\n");
printf("Часы:\t");
fflush(stdin);
scanf("%d", &p->chas);
}
fflush(stdin);
printf("Минуты:\t");
scanf("%d", &p->min);
while (p->min < 0 || p->min > 59) {
printf("\nОшибка. Введите минуты ещё раз (в часе 60 минут)!\n");
printf("Минуты:\t");
fflush(stdin);
scanf("%d", &p->min);
}
}
void vvod(struct zvezda *p)
{
fflush(stdin);
printf("Название звезды:\t");
scanf("%s", &p -> zv_name);
fflush(stdin);
printf("Видимая величина:\t");
scanf("%lg", &p -> zv_velichina);
fflush(stdin);
printf("Расстояние до Земли:\t");
scanf("%lg", &p -> l.ras);
fflush(stdin);
printf("\nРасстояние до Земли записано в световых годах или километрах?\n");
printf("Если в св. годах, то нажмите - 1, если в километрах нажмите - 0: ");
scanf("%d", &p -> l.godkm);
while (p->l.godkm > 1 || p->l.godkm < 0) {
printf("\nОшибка. Повторите попытку!\n");
printf("Введите 1 (св года) или 0 (км): ");
fflush(stdin);
scanf("%d", &p->l.godkm); }
fflush(stdin);
printf("\nКоординаты на небосклоне:\t");
vvodzvkoordinati(&p -> k);
}
void poisk(const struct zvezda A[], int n, double zv1)
{
int i, k;
for (i = 0, k = 0; i < n; i++)
if (A[i].zv_velichina == zv1)
{
printf("\n*** Запись № %d ***\n", ++k);
vivodinfo(&A[i]);
}
printf("\nНайдено %d записей из %d.\n", k, n);
}
int dobav_number(int n)
{
int k;
if (n == 0){return 0;}
if (n == 1){return 1;}
fflush(stdin);
printf("Укажите номер записи для вставки новой записи (от 1 до %d): ", n);
scanf("%d", &k);
while (k < 1 || k > n) {
printf("Ошибка. Проверьте правильность ввода и повторите попытку!\n");
printf("Укажите номер записи для вставки (от 1 до %d): ", n);
fflush(stdin);
scanf("%d", &k); }
return k;
}
int udal_number(int n)
{
int k;
if (n == 0){return 0;}
if (n == 1){printf("Запись №1 удалена!\n\n");return 1;}
fflush(stdin);
printf("Укажите номер записи, которую необходимо удалить (от 1 до %d): ", n);
scanf("%d", &k);
while (k < 1 || k > n) {
printf("Ошибка. Проверьте правильность ввода и повторите попытку!\n");
printf("Укажите номер записи, которую необходимо удалить (от 1 до %d): ", n);
fflush(stdin);
scanf("%d", &k); }
printf("Запись №%d удалена!\n\n", k);
return k;
}
int vivod_number(int n)
{
int k;
if (n == 0){return 0;}
if (n == 1){return 1;}
fflush(stdin);
printf("Укажите номер записи для её поиска (от 1 до %d): ", n);
scanf("%d", &k);
while (k < 1 || k > n) {
printf("Ошибка. Проверьте правильность ввода и повторите попытку!\n");
printf("Укажите номер записи для её поиска (от 1 до %d): ", n);
fflush(stdin);
scanf("%d", &k); }
return k;
}
int sravnenie(const struct zvezda *p1, const struct zvezda *p2)
{
double rast1, rast2;
if (p1 -> l.godkm)
rast1 = p1->l.ras*9460730472580820.0;
else
rast1 = p1->l.ras;
if (p2 -> l.godkm)
rast2 = p2->l.ras*9460730472580820.0;
else
rast2 = p2->l.ras;
return rast1 > rast2 || rast1 == rast2;
}
void sort(struct zvezda A[], int n)
{
int i, j;
for (j = 1; j < n; j++)
for (i = 0; i < n-j; i++)
if (sravnenie(&A[i], &A[i+1]))
{
struct zvezda temp;
temp = A[i];
A[i] = A[i+1];
A[i+1] = temp;
}
}
int main()
{
struct zvezda A[50];
int number, n=0, i, k, d=0;
double zv;
system("chcp 1251 > nul");
while (d<2) {
system("cls");
printf("___________________________________________________________________\n"
"********************|-----------MENU----------|********************\n"
"*******************************************************************\n"
"* 1. Добавить запись *\n"
"* 2. Вставить запись *\n"
"* 3. Удалить запись *\n"
"* 4. Просмотреть запись *\n"
"* 41 - по указанному номеру *\n"
"* 42 - по видимой величине *\n"
"* 43 - все записи *\n"
"* 5. Сортировать записи (по возрастанию расстояния до Земли) *\n"
"* 6. Сохранить записи в файл *\n"
"* 7. Загрузить записи из файла *\n"
"* ??? *\n"
"* 9. Выйти из меню *\n"
"*******************************************************************\n>> ");
fflush(stdin);
scanf("%d", &number);
switch (number) {
case 1:
if (n < 50)
{
printf("Запись №%d:\n", n+1);
vvod(&A[n]);
n++;
}
else
printf("\aНет памяти!\n");
system("pause");
break;
case 2:
if (n < 50)
{
k = dobav_number(n) - 1;
if (k==-1)
{
printf("Записи отсутствуют!\n");
system("pause");
break;
}
if (k >= 0)
{
for (i = n-1; i >= k; i--)
A[i+1] = A[i];
printf("\nВведите информацию для записи №%d:\n\n", k+1);
vvod(&A[k]);
}
n++;
}
else
system("pause");
printf("\aНет памяти!\n");
break;
case 3:
k = udal_number(n) - 1;
if (k==-1)
{
printf("Записи отсутствуют!\n");
system("pause");
break;
}
else
{
for (;k<n;k++)
A[k]=A[k+1];
n--;
}
system("pause");
break;
case 41:
k = vivod_number(n);
if (k == 0) {printf("Записи отсутствуют!\n");}
if (k == 1) {printf("\nВот информация о записи №1:\n\n"); vivodinfo(&A[1]);}
if (k > 1) {printf("\nВот информация о записи №%d:\n\n", k);vivodinfo(&A[k-1]);}
system("pause");
break;
case 42:
if (n == 0) {printf("Записи отсутствуют!\n");}
else
{
fflush(stdin);
printf("Введите видимую величину звезды: ");
scanf("%lg", &zv);
poisk(A, n, zv);
}
system("pause");
break;
case 43:
if (n == 0) {printf("Записи отсутствуют!\n");}
else
{
for (i=0; i<n; i++)
{
printf("\n*** Запись № %i ***\n", i+1);
vivodinfo(&A[i]);
}
}
system("pause");
break;
case 5:
if (n == 0) {printf("Записи отсутствуют!\n");}
if (n > 0) {
sort(A, n);
printf("Сортировка успешно выполнена!\n");
}
system("pause");
break;
case 6:
system("cls");
save(A, n);
system("cls");
printf("Записывание в файл выполнена успешно!\n");
system("pause");
break;
case 7:
system("cls");
zagruzka(A, n);
printf("Загразка из файла выполнена успешно!\n");
system("pause");
break;
case 9:
return 0;
default:
printf("\aОперация не найдена! Повторите попытку \n");
system("pause");
break;
}
}
system("pause");
return 0;
}