Witam ponownie.
Mam nadzieję, że nikogo nie zanudzę na śmierć.
Otóż mam napisać program, który zajmuje się plikami. Przechowuje w pliku binarnym nazwisko, wiek oraz wzrost.
Posiada 7 funkcji:
- Tworzy plik o n elemetach. (Napisałem)
- Wypisuje dane w pięknej tabeli. (Napisałem)
- Szuka i wypisuje rekordy o podanych danych. (Napisałem)
- Wstawia element x na pozycję p (używając plik pomocniczy).
- Usuwa podany element (używając plik pomocniczy).
- Przepisuje elementy z pliku f do pliku g sortując je wg. danego 'klucza'. (Napisałem)
- Konczy program. (Napisałem)
Problem pozostał z funkcjami 4 i 5. Mam wykorzystać do obydwu plik pomocniczy - i teraz co mam w tym pliku pomocniczym zawrzeć? Przekopiować późniejsze elementy od tego, który chcę usunąć/przesunąć? Ogólna koncepcja jak to zrobić pomogłaby mi.
Oto kod (jeśli ktoś by sprawdził, to bym podziękował):
#include <stdio.h>
#include <iostream>
struct Osoba
{
char nazwisko[20];
float wzrost;
int wiek;
};
void Create(f, int i);
void Print(f);
void Search(f, char nazwisko[20], int wiek, float wzrost1, float wzrost2);
void Insert(f, int x, int p);
void Delete(f, int p);
void Sort(f, g, string klucz);
int ile=0;
int main()
{
printf("1. Stworz plik o podanej liczbie rekordow.\n");
printf("2. Wypisz wszystkie rekordy w pliku w tabeli.\n");
printf("3. Znajdz i wypisz rekordy, które maja podane nazwisko, wiek i wzrost.\n");
printf("4. Wstaw rekord x na pozycje p.\n");
printf("5. Usun rekord z danej pozycji p.\n");
printf("6. Przepisz rekordy z pliku f do pliku g sortujac je wg. klucza.\n");
printf("7. Zakoncz program.\n");
int w, i, wiek, x, p;
float wzrost, wzrost1, wzrost2;
char nazwisko[20];
string f, g, klucz;
while (1)
{
switch (w):
case 1: printf("Podaj nazwe nowego pliku\n"); scanf("%s", f); printf("Podaj ilosc rekordow:\n"); scanf("%d", &i); Create(f, i);
case 2: printf("Podaj nazwe pliku, ktory chcesz wyswietlic:\n"); scanf("%s", f); Print(f);
case 3: printf("Podaj nazwe pliku, z ktorego chcesz wypisac rekordy:\n"); scanf("%s", f); printf("Podaj nazwisko:\n"); scanf("%s", nazwisko); printf("Podaj wiek:\n");
scanf("%d", wiek); printf("Podaj przedzial wzrost1, wzrost2:\n"); scanf("%f %f", wzrost1, wzrost2); Search(f, nazwisko, wiek, wzrost1, wzrost2);
case 4: printf("Podaj nazwe pliku, w ktorym chcesz przestawic rekord:\n"); scanf("%s", f); printf("Podaj numer rekordu, który chcesz przenieść:\n");
scanf("%d", &x); printf("Podaj numer, na ktory chcesz przeniesc rekord:\n"); scanf("%d", p); Insert(f, x, p);
case 5: printf("Podaj nazwe pliku, z ktorego chcesz usunac:\n"); scanf("%s", f); printf("Ktory rekord chcesz usunac:\n"); scanf("%d", p); Delete(f, p);
case 6: printf("Podaj nazwe pliku, z ktorego chcesz przepisac:\n"); scanf("%s", f); printf("Podaj nazwe pliku, do ktorego chcesz przepisac:\n");
scanf("%s", g); printf("Podaj klucza sortowania:\n"); scanf("%s", klucz); Sort(f, g, klucz);
case 7: return 0;
}
return 0;
}
void Create(string f, int i)
{
Osoba tab[i];
ile = i;
for(int j=0, j<i, j++)
{
printf("Podaj nazwisko, wiek i wzrost:\n");
scanf("%s %d %f", &tab[j].nazwisko, &tab[j].wiek, &tab[j].wzrost);
}
FILE* file=fopen(f,"wb");
fwrite(&tab, sizeof(Osoba), i, f);
fclose(f);
}
void Print(string f)
{
Osoba tab[ile];
FILE* file=fopen(f, "ab");
fread(&tab, sizeof(Osoba), ile, f);
for(int j=0;j<ile;j++)
{
cout.width(5);
cout << left << "|" << internal << j+1 << "." << right << "|";
cout.width(22);
cout << internal << nazwisko << right << "|";
cout.width(5);
cout << internal << wiek << right << "|";
cout.width(8);
cout << internal << wzrost << right << "|" << endl;
}
fclose(f);
}
void Search(string f, char nazwisko[20], int wiek, float wzrost1, float wzrost2)
{
Osoba tab[ile];
FILE* file=fopen(f, "ab");
fread(&tab, sizeof(Osoba), ile, f);
fclose(f);
for(int j=0;j<ile;j++)
{
if(nazwisko != 0 && wiek != 0)
{
if(tab.nazwisko == nazwisko && tab.wiek == wiek && tab.wzrost >= wzrost1 && tab.wzrost <= wzrost2)
{
printf("%s %f %i", &tab[j].nazwisko, &tab[j].wzrost, &tab[j].wiek);
}
} else if(nazwisko == 0 && wiek != 0) {
if(tab.wiek == wiek && tab.wzrost >= wzrost1 && tab.wzrost <= wzrost2)
{
printf("%s %f %i", &tab[j].nazwisko, &tab[j].wzrost, &tab[j].wiek);
}
}else if(nazwisko != 0 && wiek == 0) {
if(tab.nazwisko == nazwisko && tab.wzrost >= wzrost1 && tab.wzrost <= wzrost2)
{
printf("%s %f %i", &tab[j].nazwisko, &tab[j].wzrost, &tab[j].wiek);
}
} else if(nazwisko == 0 && wiek == 0) {
if(tab.wzrost >= wzrost1 && tab.wzrost <= wzrost2)
{
printf("%s %f %i", &tab[j].nazwisko, &tab[j].wzrost, &tab[j].wiek);
}
}
}
}
void Insert(string f, int x, int p)
{
void Delete(string f, int p)
void Sort(string f, string g, string klucz)
{
Osoba tab[ile];
FILE* file=fopen(f, "ab");
fread(&tab, sizeof(Osoba), ile, f);
fclose(f);
int zamiana;
Osoba tmp;
if(klucz == 'nazwisko')
{
for(int j=0;j<ile;j++)
{
zamiana = 0;
for(int i=0;i<ile-j;i++)
{
if(tab[j+1].nazwisko < tab[j].nazwisko)
{
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
zamiana = 1;
}
} if(!change) break;
}
} else if(klucz == 'wzrost') {
for(int j=0;j<ile;j++)
{
zamiana = 0;
for(int i=0;i<ile-j;i++)
{
if(tab[j+1].wzrost < tab[j].wzrost)
{
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
zamiana = 1;
}
} if(!change) break;
}
} else if(klucz == 'wiek') {
for(int j=0;j<ile;j++)
{
zamiana = 0;
for(int i=0;i<ile-j;i++)
{
if(tab[j+1].wiek < tab[j].wiek)
{
tmp = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tmp;
zamiana = 1;
}
} if(!change) break;
}
}
FILE* file=fopen(g, "wb");
fwrite(&tab, sizeof(Osoba), ile, g);
fclose(g);
}
Dzięki za sugestie i sprawdzenie.