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.
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).
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..
A jak otwierasz plik?
Otwieram przez open O_RDWR
char buf;
lseek(x,-1,SEEK_END);
read(x,&buf,1);
++buf;
lseek(x,-1,SEEK_END);
write(x,&buf,1);
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)
Masz odwrócić kolejność pliku?
Tak "przetransformować" go od końca.
To czemu z qwerty
ma być YTREWQ
a nie QWERTY
?
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..
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.
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?
Można to zrobić na milion sposobów. Podaj pełną treść zadania.
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.
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).
Mógłby ktoś nakierować kodem jak to zrobić? Z góry dzięki :)
Z czym konkretnie masz problem?
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ć?
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?
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?
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
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.
lseek()
- poczytaj co piszą w man