Pliki i struktury, usunięcie struktury o numerze w niej podanym.

0

Witam, napisałem taki oto program który za zadanie ma wykonywać proste operacje na strukturach. Gdy deklaruje osoby i zapisuje je do pliku jedną z danych jest numer.

  1. Jak będzie wyglądała funkcja która będzie usuwała z pliku osobę o tym numerze(funkcja usuń).
  2. Czy jest możliwość aby gdy otworzę ten plik z danymi nie pojawiały się w niektórych miejscach "szlaczki" tylko dokładnie te informacje które podałem?
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void nowy (void);
void dopisz (void);
//void usun (void);
void wyswietl (void);

struct osoba
{
	char imie[20];
	char nazwisko[20];
	int numer;
}czlowiek;

FILE *plik;

main()
{
	char znak;

	do
	{
		
		printf("\npodaj znak\n n-otworz plik\n d-dopisz osobe\n u-usun osobe o podanym numerze\n w-wyswietl wszystkich\n z-wyjscie");
		fflush(stdin);
		znak=getchar();

		switch (znak)
		{
		case 'n':
			nowy();
			break;

		case 'd':
			dopisz();
			break;

		/*case 'u':
			usun();
			break;*/

		case 'w':
			wyswietl();
			break;
		case 'z':
			system("cls");
			fclose(plik);
			printf("\nplik zostal zamkniety\n");
			printf("nacisnij klawisz q aby zamknac program\n");
			break;
		}

	} while (znak !='q');

}

void nowy (void)
{
	system("cls");
	plik=fopen("c:/onp/lab6.txt", "w+");
	printf("plik zostal utworzony\n");
}

void dopisz (void)
{
	system("cls"); 
	printf("podaj imie ");
	scanf("%s", czlowiek.imie);
	printf("podaj nazwisko ");
	scanf("%s", czlowiek.nazwisko);
	printf("podaj numer ");
	scanf("%d", &czlowiek.numer);
	fwrite(&czlowiek,sizeof(struct osoba),1,plik);
};

void wyswietl(void)
{
	struct osoba wysw;
	system("cls");
	fclose(plik);
	plik=fopen("c:/onp/lab6.txt", "r");
	printf("\n imie \t\t nazwisko \t\t numer\n");
	while (fread(&wysw,sizeof(struct osoba),1,plik)==1)
	{
		printf("\n %s \t\t %s \t\t %d\n", wysw.imie,wysw.nazwisko,wysw.numer);
	}
}
1
  1. przepisać wszystko z pliku do pliku tymczasowego.
  2. przepisać wszystko oprócz podanego numeru z pliku tymczasowego do pliku.
0

Zrobiłem. Poniżej kod, może nie jest idealny ale program wykonuje swoje działanie.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

void nowy (void);
void dopisz (void);
void usun (int liczba);
void wyswietl (void);

struct osoba
{
	char imie[20];
	char nazwisko[20];
	int numer;
}czlowiek;

FILE *plik;

main()
{
	char znak;
	int element;
	
	do
	{
		
		printf("\npodaj znak\n n-utworz plik\n d-dopisz osobe\n u-usun osobe o podanym numerze\n w-wyswietl wszystkich\n z-wyjscie\n");
		fflush(stdin);
		znak=getchar();

		switch (znak)
		{
		case 'n':
			nowy();
			break;

		case 'd':
			if (plik==NULL)
				printf("plik nie zostal utworzony");
			else
				dopisz();
	
			break;
		case 'u':
			printf("podaj numer osoby");
			scanf("%d", &element);
			usun(element);
			break;

		case 'w':
			if (plik==NULL) 
				printf("plik nie zostal utworzony");
			else
			wyswietl();

			break;
		case 'z':
			system("cls");
			fclose(plik);
			printf("\nplik zostal zamkniety\n");
			printf("nacisnij klawisz q aby zamknac program\n");
			break;
		}

	} while (znak !='q');

	fclose(plik);
}

void nowy (void)
{
	system("cls");
	plik=fopen("lab6.txt", "w+");
	printf("plik zostal utworzony\n");
}

void dopisz (void)
{
	fclose(plik);
	plik=fopen("lab6.txt", "a");
	system("cls"); //czyszczenie ekranu, potrzeba biblioteka stdlib.h
	printf("podaj imie ");
	scanf("%s", czlowiek.imie);
	printf("podaj nazwisko ");
	scanf("%s", czlowiek.nazwisko);
	printf("podaj numer ");
	scanf("%d", &czlowiek.numer);
	fwrite(&czlowiek,sizeof(struct osoba),1,plik);
};

void wyswietl(void)
{
	struct osoba wysw;
	system("cls");
	fclose(plik);
	plik=fopen("lab6.txt", "r");
	printf("\n imie \t\t\t nazwisko \t\t\t numer\n");
	while (fread(&wysw,sizeof(struct osoba),1,plik)==1)
	{
		printf("\n %s \t\t\t %s \t\t\t %d\n", wysw.imie,wysw.nazwisko,wysw.numer);
	}
}

void usun(int liczba)
{
	struct osoba temp;
	FILE *plik2;
	
	plik=fopen("lab6.txt", "r");
	plik2=fopen("lab6temp.txt", "w+");
	
		while (fread(&temp,sizeof(struct osoba),1,plik)==1)
		{
			if (temp.numer != liczba)
			{
				fwrite(&temp,sizeof(struct osoba),1,plik2); 
			}
		}
	
	fclose(plik);
	fclose(plik2);
	
	plik=fopen("lab6.txt", "w+");
	plik2=fopen("lab6temp.txt", "r");

		while (fread(&temp,sizeof(struct osoba),1,plik2)==1)
		{
			fwrite(&temp,sizeof(struct osoba),1,plik);
		}
	
	fclose(plik2);
}
0

Wg mnie to powinieneś na dzień dobry otwierać ten plik. Opcje 'z' - powinieneś usunąć a plik zamykać przy wyjściu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1