[C] Kasowanie lini w pliku

0

Witam. Piszę program, którym muszę mieć taką funkcje, która kasuje wybrane linijki w pliku tekstowym. To znaczy, wybieram linijkę ustawiając kursor fseek'iem i chce ją cała skasować. Jest jakaś funkcja na to? Jeśli nie to jak takie coś napisać?

0

NIE DA SIĘ kasować czegoś ze środka pliku. Jeśli chcesz tak zrobić to musisz przepisać sobie wszystko co było za tą kasowaną linią "wyżej".

0

hmm może trzeba trochę podejść inaczej jak chcesz cokolwiek zmienic ze srodka pliku mozna zrobic tak. Wczytac plik do bufferu i masz kolejne indeksy tablicy np buffer[22]=jakiś tam znak i zapis masz juz zmienione ze środka. Już coś:P możesz tez robić nietrudne rozwiązanie np wyszukiwanie nazw w pliku jak masz bazę z imię i nazwisko klienta JanKowalski możesz w rożny sposób przeskanować tablice w poszukiwaniu tej nazwy nawet ifami (co trochu trudniej) możesz przyjąć koncepcje że dane w pliku txt są za tą nazwa wtedy możesz wczytywać dane w sposob następujący
"JanKowalski:jakistamtekstokliencie#"
możesz zacząć wczytywanie do nowej tablicy od znaku ':' do '#' (taki przyklad podalem :P)
lub możesz zmienić tablice wczytaną z pliku(nawet lepiej pracować na tej xD)
ale tu się pojawia problem taki ze możesz tylko zmienić na tyle ten tekst ile wynosi "jakistamtekstokliencie" ma 22 znaki nie możesz zmienić tego tekstu np na 26 znaków bo wejdziesz w nazwę klienta dlatego proponuje opanować takie coś nazywane listami albo jeszcze inne vektory jak pamiętam. Podałem przykładową operację na pliku myślę, że choć trochę pomogłem :)

0

No dobra, jak już mam to w tablicy i zlokalizowałem te indeksy, z których chce usunąć znak to co zrobić?

0

usunąć go :D :D

0

W jaki sposób żeby nie zakłócić indeksów poniżej?

0

Musisz wszystko za usuniętymi elementami przesunac do tylu.

0

ma to wyglądać mniej więcej tak
1 2 3 4 5 6 7 8 - index tablicy
a b c d e f g h - znaki

zakładamy ze chcemy usunąć (tylko usunąć bo jak chcesz dodawac to sprawa jest trudniejsza, bo trzeba chociaż by użyć tablic dynamicznych by dodawac indeksy jak braknie co nie wyklucza tez zwykłych np ustawic na b dużą jak masz problem z listami etc.) 'c' i 'd'

1 2 3 4 5 6 7 8
a b e f g h

czyli pozostałe elementy po 'b' maja iść w dol
można nawet to zrobić na zwykłej tablicy a 7 i 8 index ustawić na null ze byśmy czasem nie zapisali jakiejś niepotrzebnej spacji xD
aby znaleźć coś w pliku można użyć fscan jak pamiętam ale proponuje samemu :P

w sumie algorytm nie jest najprostszy :P
wiec w pewnym sensie ci pomogę podaje tu algorytm usunięcia danych przykładowego klienta algorytm jest napisany lopatą bez żadnych funkcji zewnętrznych ani bibliotek

#include <iostream>
using namespace std;

int main()
{
int l=0;
bool find=false;
int in=0;
int index=0;
int index2=0;
int size2=0;
int size=0;

int licz=0;

/Powiecmy ze pobrany buffor wyglada jak ponizej
gdzie przykladowo "abcd" to imie klienta za ":" informacja a za "#"
dalsza czesc dokumentu te fff
/

char tab[100]="fff#abcd:costamonim#ffff"; 

char tab2[10]="";

cout<<"Nasz plik ma postac:"<<endl;
cout<<tab<<endl;
cout<<"find text:"<<endl;
cin>>tab2;

for(int i=0;i<sizeof(tab);i++) //pobieram rozmiar zwyklej tablicy1
{
if(tab[i]==NULL)
break;
size+=1;

}

for(int i=0;i<sizeof(tab2);i++) //pobieram rozmiar zwyklej tablicy2
{
if(tab2[i]==NULL)
break;
size2+=1;

}

while(l<100) //algorytm przeszukiwania tablicy
{
l++;
for(int i=0;i<size;i++)
{
if(tab[i]==tab2[0])
{
in=i;
break;
}
}
int qw=0;
for(int i=in;i<i+size2;i++)
{
qw+=1;
if(tab2[qw]!=tab[i+1])break;
else
{
licz++;
if(licz==size2)
{
find=true;
index=i+size2+1; //dzieki temu dostajemy index 1 elementu opisu klienta
}

	}
}

if(find==true)
{
	cout<<"succesfull"<<endl;
	break;
}

}
if(find==false)
{
cout<<"Brak wynikow zapytania"<<endl;
system ("pause");
return 0;
}

//teraz musimy zdobyc koniec opisu klienta
for(int i=index;i<size;i++)
{
if(tab[i]=='#')
{
index2=i;/dzieki temu mamy index drabinki ktora trzeba przesunac elementu tablicy
dzieki czemu mozemy sobie przekopiowac fragment bufforu do nowej tablicy
jezeli odejmieny jeszcze jeden elemet
/
}
}

int delta=index2-index; //teraz mamy dlugosc skoku pomiedzy opisem klienta

char cop[100]=""; //twozymy podobna tablice do buffora pliku

for(int i=0;i<100;i++) //kopiujemy
cop[i]=tab[i];

for(int i=index;i<100-index;i++) //teraz zamieniamy elemety tablicy o delte
tab[i]=cop[i+delta];

cout<<tab<<endl;//wyswietlamy sffekt naszej pracy :D

system ("pause");
return 0;
}

tylko troche algorytm przeszukiwania zrypalem ale niemam kiedy go poprawic mysle ze to bedzie ci pomocne D pozdrawiam

0

@up według ciebie to jest C?

0

Sorry mój błąd nie spojrzałem xD
Edit:
ale proszę o choć trochę własnego wkładu nie wydaje mi się żeby było trudne pozamieniać strumienie z c++ na c i zmienić nagłówek. Twoim zadaniem będzie tylko wczytać do tego bufferu plik i troche petle naprawic bo wyszukuje 2 poczatkowe znaki klucza i zapis tam gdzie wyswietlam wynik do pliku i masz najprostsza baze

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