Czy jest możliwość w C usunięcia podanej linii z pliku, bez pomocy drugiego(pomocniczego) pliku?
Wczytać plik do RAMu, usunąć linie i zapisać z powrotem do tego samego pliku?
który sposób jest łatwiejszy?
To co powiedział @KeeL to jest jeden cały sposób, nie trzy pomniejsze :|
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
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.
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.
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?
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