Usuwanie tekstu z pliku

0

Czy jest możliwość w C usunięcia podanej linii z pliku, bez pomocy drugiego(pomocniczego) pliku?

0

Wczytać plik do RAMu, usunąć linie i zapisać z powrotem do tego samego pliku?

0

który sposób jest łatwiejszy?

1

To co powiedział @KeeL to jest jeden cały sposób, nie trzy pomniejsze :|

0

Bo ja muszę zrobić program sprzedażowy, czyli podaję nazwe oraz ilość towaru, a on mi go kasuje i utknąłem na tym jak to zrobić, czy drugi dodatkowy plik, czy jakoś inaczej, aktualnie mam tyle napisane:

 void sprzedaz(void)
{
	FILE *fp = fopen("magazyn.txt", "r");
	char odp[5];
	do
	{
	printf("\nPodaj nazwe towaru, ktory zostal sprzedany: ");
	scanf("%s", magazyn.nazwa);
	printf("\nPodaj jego ilosc: ");
	scanf("%d", magazyn.ilosc);
	printf("\nCzy sprzedaz zostala zakonczona? t - tak\tn - nie\n");
	scanf("%5s", &odp);
	}
	while (odp[0] != 't');
	fclose(fp);
}

oczywiście wszystko opiera się na strukturze:

 struct magazyn
{
	char nazwa[30];
	int cena, ilosc;
}magazyn;

Patryk27, Wiem, że to co podał KeeL to jest jeden sposób, tylko, czy ten jego jest łatwiejszy, czy pomoc z drugim plikiem

0

Jak zależy Ci na wydajności:

  • przesuwasz wskaźnik pliku poza linie którą chcesz usunąć
  • wczytujesz reszte pliku do bufora
  • przesuwasz wskaźnik pliku przed linijkę którą chcesz usunąć
  • zapisujesz dane z bufora
  • przycinasz plik do nowego rozmiaru (na Windowsie to np. jest SetEndOfFile, na Linuksie też coś tam jest).

A jak chcesz ekstra wydajność to użyj Memory Mapped File (algorytm będzie podobny, tyle że wtedy nawet nie musisz używać dodatkowego bufora).
Jak widzisz nie musisz użyć pomocniczego pliku.

0

Podchodzisz do problemu od złej strony. Wczytaj na starcie programu całą strukturę pliku (do struktur magazyn). Operuj na tej kolekcji podczas działania programu (dodawaj/usuwaj/edytuj). Jak wszystko będzie gotowe to zapisz cały plik na nowo.

0

To już mam jakoś zrobione, ale jeszcze jedno pytanie odnośnie kodu:

void zestawienie(void)
{
	FILE *fp=fopen("magazyn.txt", "r");
	int wartosc=1,suma=0;
	printf("Nazwa towaru\tIlosc\tCena\tWartosc\n");
	while (fread(&magazyn,1,sizeof(magazyn),fp))
	{
		wartosc=(magazyn.ilosc * magazyn.cena);
		printf("%s\t%d\t%d\t%d", magazyn.nazwa,magazyn.cena, magazyn.ilosc, wartosc);
		suma = suma + wartosc;
	}
	printf("\n\n");
	printf("Suma wartosci towarow: %d\n", suma);
	fclose(fp);
} 

Na tej samej strukturze się to opiera, ale program nie chce wyświetlić wartości zmiennych "wartosc" i "suma"
Ktoś wie dlaczego?

0

Takie jest moje kasowanie z pliku, któro jednak nie działa tak jak powinno...
Tutaj macie cały kod programu:

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

struct magazyn
{
	char nazwa[30];
	int cena, ilosc;
}magazyn;

void dodaj(char *nazwa, int ilosc, int cena);
void sprzedaz(void);
void zestawienie(void);

main()
{
	int wybor;
	char odp[5];
	do
	{
	scanf("%d", &wybor);
	switch (wybor)
	{
			case 1: dodaj(magazyn.nazwa,magazyn.ilosc,magazyn.cena);
			break;
			case 2: sprzedaz();
			break;
			case 3: zestawienie();
			break;
			default: printf("Zly");
			break;
		}
	printf("Co chcesz zakonczyc?");
	scanf("%5s", &odp);
	}
	while (odp[0] != 't');
	system("pause");
}

void dodaj(char *nazwa, int ilosc, int cena)
{
	int i,a;
	FILE *fp=fopen("magazyn.txt", "a");
	printf("Podaj ilosc towarow do dodania: \n");
	scanf("%d", &a);
	for(i=0;i<a;i++)
	{
		printf("\nPodaj nazwe towaru: ");
		scanf("%29s", magazyn.nazwa);
		printf("\nPodaj jego ilosc: ");
		scanf("%d", &magazyn.ilosc);
		printf("\nPodaj jego cene: ");
		scanf("%d", &magazyn.cena);
		fprintf(fp,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.ilosc,magazyn.cena);
	}
	fclose(fp);
}

void sprzedaz(void)
{
	FILE *fp = fopen("magazyn.txt", "r");
	char odp[5],nazwa[30];
	int i=0,a,ilosc;
	do
	{
	printf("\nPodaj nazwe towaru, ktory zostal sprzedany: ");
	scanf("%29s", nazwa);
	printf("\nPodaj jego ilosc: ");
	scanf("%d", &ilosc);
	while(!feof(fp))
	{
		fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.cena, &magazyn.ilosc);
		i++;
	}
	fclose(fp);
	fp = fopen("magazyn.txt", "w");
	fclose(fp);
	for (a=0;a<i;a++)
	{
		if(!strcmp(magazyn.nazwa,nazwa))
		{
			magazyn.ilosc = magazyn.ilosc - ilosc;
		}
	}
	for (a=0;a<i;a++)
	{
		if (magazyn.ilosc>0)
		{
			fprintf(fp,"%s\t\t%d\t%d\n",magazyn.nazwa,magazyn.ilosc,magazyn.cena);
		}
	}
	printf("\nCzy sprzedaz zostala zakonczona? t - tak\tn - nie\n");
	scanf("%5s", &odp);
	}
	while (odp[0] != 't');
	fclose(fp);
}

void zestawienie(void)
{
	FILE *fp=fopen("magazyn.txt", "r");
	int wartosc=0,suma=0;
	printf("Nazwa towaru\tIlosc\tCena\tWartosc\n");
	while (!feof(fp))
	{
		fscanf(fp,"%s%d%d", magazyn.nazwa, &magazyn.cena, &magazyn.ilosc);
		wartosc=magazyn.ilosc*magazyn.cena;
		printf("%s\t\t%d\t%d\t%d\n", magazyn.nazwa, magazyn.cena, magazyn.ilosc, wartosc);
		suma = suma + wartosc;
	}
	printf("\n\n");
	printf("Suma wartosci towarow: %d\n", suma);
	fclose(fp);
}

Jeżeli ktoś wie, co należy zmienić w funkcji sprzedaż, to niech mnie nakieruje

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