C Linux cofnięcie deskryptora po odczycie znaku

0

Witam, muszę napisać program (C Linux), który będzie odczytywał plik z argumentu, w pętli zmieniał wielkość liter z małych na duże oraz zapisywał do tego samego pliku. Z wszystkim sobie poradziłem ale mam jeden problem mianowicie przepisuje mi tak przykład qwerty przepisze jako qWeEtT, ponieważ w pętli czyta jeden znak -> przesuwa deskryptor i zapisuje znak na miejscu już przesuniętym po odczycie. Czy istnieje jakaś komenda aby cofnąć deskryptor o jeden po każdym odczytaniu znaku?
Z góry dziękuję za pomoc, pozdrawiam.

0

lseek(plik, -1, SEEK_CUR) lub fseek(plik, -1, SEEK_CUR) w zależności od tego, czy plik masz dany jako deskryptor (np. otwierałeś funkcją open) czy jako FILE * z stdio (np. otwierałeś fopen).

0

Dzięki, działa mam jeszcze pytanie, jak mam ustawić deskryptor na końcu pliku, przeczytać ostatnią literkę i cofać o jeden "w przód" deskryptor? Rozwiązanie:

//kod
lseek(x,0,SEEK_END);
lseek(x,-1,SEEK_CUR);
while((y = read(x,buf,1)) > 0 ) {
lseek(x,-1,SEEK_CUR);
//kod write
lseek(x,-1,SEEK_CUR);
}

nie działa..

0

A jak otwierasz plik?

0

Otwieram przez open O_RDWR

0
char buf;
lseek(x,-1,SEEK_END);
read(x,&buf,1);
++buf;
lseek(x,-1,SEEK_END);
write(x,&buf,1);
0

No ale chodzi mi o to że: Muszę przeczytać plik txt od tyłu zmieniając przy tym ostatni znak z małej na wielką literę, a rozwiązanie, które zapętla w nieskończoność ostatnią literkę :/ Aktualnie mam:

Otwieram open O_RDWR
lseek -1 SEEK_END
while((y = read(x,buf,1)) > 0 )
*buf=toupper(*buf); //zmiana wielkości litery
lseek -1 SEEK_CUR (SEEK_END też próbowałem chociaż nie ma wgl sensu w tym miejscu)
write x,buf,y

ma ktoś pomysł jak stworzyć taki "program" co będzie odczytywał plik od tyłu i zmieniał wielkość liter na wielkie? np z qwerty ma być YTREWQ. (zmiana wielkości działa oczywiście, tylko nie wiem jak rozwiązać problem z tym deskryptorem)

0

Masz odwrócić kolejność pliku?

0

Tak "przetransformować" go od końca.

0

To czemu z qwerty ma być YTREWQ a nie QWERTY ?

0

bo mam przeczytać od tyłu zmienić znaki na duże i zapisać w tym samym pliku.. Ostatnia literka ma być pierwszą przedostatnia drugą itd..

0

W takim razie z: qwerty wyjdzie ci: YTETY ponieważ jak dojdziesz do połowy pliku będziesz już mieć pierwszą połowę pliku nadpisaną.
Może jednak uściślij zadanie, bo mam wrażenie że go nie rozumiesz.

0

Chodzi o to, że program ma działać w obrębie tego samego pliku i zawartość pliku ma przepisać od tyłu i zmienić na wielkie litery. Wychodzi na to, że chyba trzeba całą zawartość pliku wrzucić do jakiegoś bufora i przepisać z stamtąd. Jakieś pomysły?

0

Można to zrobić na milion sposobów. Podaj pełną treść zadania.

0

Treść zadania to: "Działając na jednym pliku tekstowym zamień kolejność znaków wewnątrz pliku (od ostatniego do pierwszego, ostatni ma być pierwszym, przedostatni drugim itd.) równocześnie zmieniając wielkość liter na duże.

0

Tworzysz sobie dwa bufory o rozmiaru 1<=R<=(RozmiarPliku+1)/2.
Wczytujesz do jednego fragment z początku do drugiego fragment z końca oba odwracasz oraz powiększasz zapisujesz na odwrót.
Potem powtarzamy to co wyżej dla części środkowej i tak dalej dopóki się bufory nie zajdą jeden za drugi (przy częściowym pokrywaniu się jeszcze zrobić krok).

0

Mógłby ktoś nakierować kodem jak to zrobić? Z góry dzięki :)

0

Z czym konkretnie masz problem?

0

Otwieram plik przez O_RDWR, następnie jak skonstruować pętle żeby odczytywać po jednym znaku od tyłu do jakiejś tablicy? żeby później to przepisać do pliku? jak to zrobić?

0

Jakiego słowa tu:

_13th_Dragon napisał(a):

Tworzysz sobie dwa bufory o rozmiaru 1<=R<=(RozmiarPliku+1)/2.
Wczytujesz do jednego fragment z początku do drugiego fragment z końca oba odwracasz oraz powiększasz zapisujesz na odwrót.
Potem powtarzamy to co wyżej dla części środkowej i tak dalej dopóki się bufory nie zajdą jeden za drugi (przy częściowym pokrywaniu się jeszcze zrobić krok).
nie rozumiesz?

0

A można to zrobić tak?
Otwieram plik, w pętli czytam wszystkie znaki od końca po kolei, równocześnie zmieniając na uppercase, i dodać je do jakiejś tablicy, po czym w jednym write całą tablice zapisać do pliku?
jak zrobić dynamiczną tablicę znaków?

0

Po kiego chcesz czytać od końca?
A co jeżeli plik nie zmieści się w pamięci?
Jeżeli już to czytasz cały jednym read, odwracasz w pamięci, zapisujesz jednym write.
Dynamiczna tablica - malloc + free

0

A jak ja mam przeczytać jednym read plik skoro nie znam jego wielkości? a trzecim argumentem na read jest podanie wielkości odczytywanego fragmentu.

0

lseek() - poczytaj co piszą w man

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