Czy jest możliwość w C usunięcia podanej linii z pliku, bez pomocy drugiego(pomocniczego) pliku?
Usuwanie tekstu z pliku
- Rejestracja: dni
- Ostatnio: dni
Wczytać plik do RAMu, usunąć linie i zapisać z powrotem do tego samego pliku?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 43
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
- Rejestracja: dni
- Ostatnio: dni
- Postów: 1176
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.
- Rejestracja: dni
- Ostatnio: dni
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.
- Rejestracja: dni
- Ostatnio: dni
- Postów: 43
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?
- Rejestracja: dni
- Ostatnio: dni
- Postów: 43
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