c
liam: Witam, mam nastepujacy problem − mam w 2 plikach tekstowych wypisane kilka wyrazów i chciałbym
wyszukać te które mają identyczne ostatnie 2−3 znaki. Możecie dać mi jakieś wskazówki, nie
rozwiązanie. Pozdrawiam
10 maj 15:50
Kejt:
zakładam, że nagłówek do zadania to nazwa języka
wskazówka: scanf(); obsługuje wyrażenia regularne (no, do czytania z pliku to będzie bodajże
fscanf(); )
10 maj 15:55
liam: Tak, hmmm rzeczywiście tak też można, ale ja teraz wpadłem na funkcje fseek i z jej pomoca
udalo mi sie poki co porownac 2 teksty , tylko nie wiem jak poprawic kod zeby porownywal kazdy
oddzielny wiersz i wyszukiwal podobienstw wsrod 2−3 ostatnich znakow
10 maj 16:04
Kejt: Pokaż kod, razem z tymi plikami tekstowymi, może coś poradzę
10 maj 16:15
Draghan: Nie wiem, jak bardzo zaawansowane ma to być wyszukiwanie podobieństwa, ale to raczej podpada
pod wyrażenia regularne.
Pobaw się manipulacjami na stringach.
Jeśli masz wczytany plik do tablicy znaków, musisz szukać w takiej tablicy znaku nowej linii
'\n'.
Stąd będziesz wiedział, że tam się kończy wiersz. Wtedy cofnij się o 3 indeksy do tyłu i masz
trzy znaki kończące wiersz...
Możesz sobie np. podzielić cały wczytany plik na tablice, w których będziesz przechowywał
osobne wiersze. Ale pójść jeszcze dalej, przechowywać po te Twoje trzy ostatnie znaki z
każdego wiersza...
Możliwości jest naprawdę sporo, ogranicza Cię tylko Twoja wyobraźnia i sprawność programowania.
Nie obraź się, ale z Twojego postu ciężko nawet wyłapać, z czym masz problem...
10 maj 16:18
liam: Teraz widze, ze jednak moja metoda nie jest dobra, ale ok wrzuce kod, moze bd miec do mnie
cierpliwosc
#include<stdio.h>
int main() {
FILE *p1, *p2;
char tab1, tab2;
long dlugosc;
const int ost=3;
p1 = fopen("czas.txt", "r");
if (p1 == NULL) {
puts("Adres jest bledny lub plik jest pusty");
exit(1);
}
fseek(p1, 0, SEEK
END);
dlugosc = ftell(p1);
fseek(p1, (dlugosc − ost), SEEK
SET);
do {
tab1 = fgetc(p1);
putchar(tab1);
} while (tab1 != EOF);
p2 = fopen("rzecz.txt", "r");
if (p2 == NULL) {
puts("Adres jest bledny lub plik jest pusty");
exit(1);
}
fseek(p1, 0, SEEK
END);
dlugosc = ftell(p1);
fseek(p1, (dlugosc − ost), SEEK
SET);
do {
tab1 = fgetc(p1);
putchar(tab1);
} while (tab1 != EOF);
if (tab1 == tab2)
printf("sa identyczne");
else if (tab1 != tab2)
printf("Nie sa takie same");
fclose(p1);
return(0);
}
10 maj 16:31
10 maj 16:33
Draghan: ...dlatego, że znak podkreślenia na tym forum oznacza indeks
dolny...
10 maj 16:35
liam: Okkk, czasem szybciej pisze niz mysle...
10 maj 16:38
liam: Chodzi mi po prostu, ze jezeli mam dwa pliki txt i w kazdym wypisane wyrazy w taki sposob
wyraz1
wyraz2
wyraz3 etc
to moim celem jest porownanie kazdego wiersza z dwoch plikow i wypisanie tych wyrazow/wierszy
ktore maja takie same 3 ostatnie litery, dzieki za cierpliwosc
10 maj 17:01
Draghan: Czy oba pliki mają identyczną ilość wierszy?
10 maj 17:05
Kejt:
Ok.
Każdy wiersz z każdym z tego samego pliku i tego drugiego? czy bierzemy pierwszy wyraz z
pierwszego i szukamy w drugim pliku takiego, który będzie miał 3 identyczne znaki na końcu?
Sorki, ale nadal się w tym trochę gubię
10 maj 17:09
liam: Nie miały, poprawiłem, niestety bez zmian
10 maj 17:09
liam: Kejt − 2 opcja czyli bierzemy 1 wierz z 1 pliku i szukamy w drugim pliku.
10 maj 17:10
Draghan: Nie, nie, nie... Pytam o warunki zadania.
Czy to ma być tak, że jeśli mamy:
−−−−−−−plik1−−−−−−−−−−−−−
Kawa
Telefon
Pisak
________________
−−−−−−−plik2−−−−−−−−−−−−−
Ława
Ssak
Telefon
________________
...to wypisze tylko Kawa−Ława?
Czy może jeszcze Pisak−Ssak?
Wiersze z odpowiadającymi sobie końcówkami powinny być w tych plikach w tym samym miejscu?
10 maj 17:12
Kejt: Już chyba jasne, podeślę jak coś będę miała ^^
10 maj 17:15
Draghan: Aaaaa, czyli takie coś...
Problem nie jest trudny.
1. Wczytujesz oba pliki do osobnych tablic.
2. (opcjonalnie, dla wygody) Dzielisz każdą z tych tablic na tablice 2−wymiarowe, które będą
zawierały poszczególne wiersze.
3. Robisz 2 zagnieżdżone pętle for − pierwsza przelatuje po wierszach z pierwszego pliku i dla
każdego wiersza przepytuje wszystkie wiersze z drugiego pliku.
10 maj 17:15
Kejt: Ok. Jeszcze tylko jedno pytanie, mam się martwić złożonością czasową i pamięciową? Czy po
prostu ma działać
10 maj 17:23
liam: W sumie co do pamięci myślałem nad wprowadzeniem mallockiem, ale nie chce doprowadzic do
sytuacji w ktorej sam malo co zrobie, wiec nad mallockiem moze samemu popracuje
10 maj 17:31
Draghan: Moje zdanie jest takie...
Działaj,
Kejt.
Tylko nie zapomnij opatrzyć kodu w komentarze, żeby
liam nie miał
problemów ze zrozumieniem i wyciągnął wnioski.
10 maj 17:31
Kejt:
Proponuję kontakt przez gg: 616192
Będzie łatwiej ^^
Teraz wychodzę, wrócę niedługo. Zostaw wiadomość.
10 maj 17:56