matematykaszkolna.pl
program Benny: ifstream f1; ofstream f2; ifstream f3; f1.open("slownik", ios::in); f2.open("przestawienie.txt"); f3.open("slownik2"); int i=0; char slowo1[30], slowo2[30]; streampos pozycja; while(!f1.eof()) { f1>>slowo1; while(!f3.eof()) { cout<<i<<endl; f3>>slowo2; if(i==0) pozycja=f3.tellg(); if(Przestawienie(slowo1,slowo2)) { f2<<slowo1<<" "<<slowo2<<endl; } i++; } f3.seekg(pozycja, ios::beg); } f1.close(); f2.close(); f3.close(); Co jest z tym nie tak?
7 sty 15:23
KKrzysiek: A jakie komunikaty błędu dostajesz?
7 sty 15:32
Benny: Właśnie problem w tym, że żadne. Kompiluje się normalnie, konsola się otwiera tylko nie wpisuje mi nic do nowego pliku. Nie wiem co z tą pierwszą pętlą. Dałem na końcu, żeby zwiększało mi licznik i o 1, a po odpaleniu licznik cały czas pokazuje 0.
7 sty 15:39
Benny: W tej wewnętrznej pętli licznik się zwiększa, ale nie wychodzi mi z niej.
7 sty 15:40
Metis: tutaj nie jest przypadkiem coś nie tak> if(Przestawienie(slowo1,slowo2)) ?
7 sty 15:45
Benny: Nie, dlaczego niby? Dałem komentarz do wnętrza całej funkcji i dodałem tylko zwiększanie licznik, czyli tylko powinno wchodzić do pierwszej pętli i zwiększać licznik o 1 dopóki plik się nie skończy. Problem jest taki, że licznik się w ogóle nie zwiększa.
7 sty 15:55
Metis: "slownik.txt" "slownik2.txt"
7 sty 16:02
Benny: To też nie o to chodzi. Plik mi się otwiera.
7 sty 16:04
Jack: w jakim jezyku to jest
7 sty 16:19
Metis: C++ emotka
7 sty 16:19
Adamm: Jack C++, patrz na składnię
7 sty 16:20
Metis: Musimy poczekać na Dziadka emotka Ale wydaje mi się, że tutaj coś nie gra : if(Przestawienie(slowo1,slowo2)) Jak kompiler ma rozumieć przestawienie? U Ciebie to tylko nazwa pliku.
7 sty 16:20
Jack: Adamm wyglada mi na C++ ale python jest rowniez podobny : D jak i samo C. ja poki co nie mam C++ tylko C
7 sty 16:22
Metis: I dobrze emotka Lepiej podobno zacząc od C, a potem przejść na C++
7 sty 16:23
Adamm: Jack, to ty chyba pythona nie widziałeś w C nie ma operatora << ani >> z tego co kojarzę
7 sty 16:23
Mariusz: Czy pliki do czytania są puste ? Jedyni sposób aby dowiedzieć się co się dzieje w programie to czytanie kodu linia po linii
7 sty 16:23
Metis: Trivial kiedyś o tym pisał.
7 sty 16:23
Mariusz: Metis Jeżeli chodzi o Przestawienie to jest do tego funkcja ale Benny jej nie napisał
7 sty 16:25
Metis: Ok emotka
7 sty 16:26
Benny: Ok, zmieniłem na to .txt i teraz mi to czyta, ale nadal nie działa jak powinno.
7 sty 16:28
Benny: Zauważyłem, że ta pętla się nie kończy. Jak skończy pobierać słowa z pliku to w konsoli pokazują mi się śmiecie.
7 sty 16:29
Metis: Dopisz: f3.clear(); przed f3.seekg(pozycja, ios::beg);
7 sty 16:39
Mariusz: Dziwne powinien się zatrzymać Dla każdej linii w pliku 1 czytasz plik 3 i jeżeli funkcja daje wartość !0 (true) to wypisujesz łańcuchy pobrane z plików 1 oraz 3 do pliku 2
7 sty 16:42
Benny: @Metis nic nie dało. Może dam cały kod. #include<iostream> #include<string.h> #include<fstream> using namespace std; int Przestawienie(char A[30],char B[30]) { int i,j=0,k=0,licznik=0; if(strlen(A)!=strlen(B)) { return 0; } else { for(i=0 ; i<=strlen(A) ; i++) { if(A[i] != B[i]) { if(licznik==0) j=i; else k=i; licznik++; } } } if((licznik == 2) && (A[j] == B[k]) && (A[k] == B[j])) return 1; else return 0; } main() { char tab1[30], tab2[30]; cin>>tab1>>tab2; cout<<tab1<<endl<<tab2<<endl; cout<<Przestawienie(tab1,tab2); ifstream f1; ofstream f2; ifstream f3; f1.open("slownik.txt",ios::in); f2.open("przestawienie.txt"); f3.open("slownik2.txt"); int i=0; char slowo1[30], slowo2[30]; streampos pozycja; while(!f1.eof()) { f1>>slowo1; i=0; while(!f3.eof()) { f3>>slowo2; cout<<slowo2<<endl; if(i==0) pozycja=f3.tellg(); if(Przestawienie(slowo1,slowo2)) { f2<<slowo1<<" "<<slowo2<<endl; } i++; } f3.seekg(pozycja, ios::beg); } f1.close(); f2.close(); f3.close(); system("pause"); }
7 sty 16:52
Metis: Metoda ifstream::clear Funkcje jak również metody do odczytu danych z pliku działają tylko wtedy, gdy strumień danych jest w poprawnym stanie. Jeżeli w trakcie pracy z plikiem wystąpił jakikolwiek błąd (tj. napotkano koniec pliku, wystąpił błąd logiczny lub sprzętowy, albo nie udało się otworzyć pliku do odczytu), to wówczas kontynuowanie pracy z obiektem std::ifstream nie będzie możliwe. Aby móc wznowić pracę ze strumieniem, należy skorzystać z metody clear, która czyści tzw. flagi błędów.
7 sty 16:58
Metis: Dodaj tę metodę do obu pętli i sprawdź
7 sty 16:58
Benny: Dobra chyba jednak to wszystko jest ok, ale mój słownik ma dużo słów, a wypisań w wierszu poleceń jest n2
7 sty 17:01
Benny: Tylko pętla się nie kończy. Na końcu programu chcę wyświetlić komunikat, ale się nie pojawia.
7 sty 17:13
KKrzysiek: W EOF'ie leży chyba problem.
7 sty 17:14
Benny: Jaki?
7 sty 17:16
KKrzysiek: Najlepiej to debugować program, dać jakiś krótki plik tekstowy składający się z 2 wierszy i szukać błędu. Nie ma lepszego narzędzia.
7 sty 17:17
Metis: Przeczytaj to co wkleiłem emotka
7 sty 17:20
Benny: Wkleiłem za tym seek i pykło Nadal nie rozumiem czemu bez tego nie działa.
7 sty 17:24
KKrzysiek: "jeżeli w trakcie pracy z plikiem wystąpił jakikolwiek błąd (tj. napotkano koniec pliku, "
7 sty 17:44
Benny: Ogarniam emotka
7 sty 17:49