Matura 2012 zad4, program przestaje działać
Ostatnio zmodyfikowano 2013-10-28 21:25
Don_Corleone Temat założony przez niniejszego użytkownika |
Matura 2012 zad4, program przestaje działać » 2013-10-27 11:51:51 Witam napisałem program do zadania 4 z matury z informatyki 2012(rozszerzona) lecz przy próbie jego uruchomienia program przestaje działać, szczegóły problemu: Nazwa zdarzenia problemu: APPCRASH Nazwa aplikacji: Matura 2012 zad 4.exe Wersja aplikacji: 0.0.0.0 Sygnatura czasowa aplikacji: 526ceef4 Nazwa modułu z błędem: ntdll.dll Wersja modułu z błędem: 6.0.6002.18881 Sygnatura czasowa modułu z błędem: 51da3e27 Kod wyjątku: c0000005 Przesunięcie wyjątku: 00067f0d Wersja systemu operacyjnego: 6.0.6002.2.2.0.768.3 Identyfikator ustawień regionalnych: 1045 Dodatkowe informacje 1: e364 Dodatkowe informacje 2: d135e63c20b27f8405159765009519be Dodatkowe informacje 3: f60e Dodatkowe informacje 4: ec2e3d2b5d9eca0fb2ece0975cd6be37 Kod: #include <iostream> #include <string> #include <fstream> using namespace std;
string koduj( string tekst, string klucz ) { string szyfr = ""; int ascii, numer, pom, pom2 = tekst.size(); for( int j = 0; j < pom2; j++ ) { ascii = tekst[ j ]; numer = klucz[ j ] - 64; if( ascii + numer <= 90 ) { pom = ascii + numer; } else { pom =( ascii + numer ) - 26; } szyfr += char( pom ); } return szyfr; } int main() { int pom, pom2; string slowo, slowo2, klucz2; fstream plik, plik2, plik3; plik.open( "C://Users/Michał/Desktop/tj.txt", ios::in ); plik2.open( "C://Users/Michał/Desktop/klucze1.txt", ios::in ); plik3.open( "C://wynik4a.txt", ios::out | ios::trunc ); if( !plik.good() ) { cout << "blad otwarcia pliku"; return 0; } if( !plik2.good() ) { cout << "blad otwarcia pliku"; return 0; } while( !plik.eof() ) { plik >> slowo; plik2 >> slowo2; if( slowo.size() <= slowo2.size() ) { plik3 << koduj( slowo, slowo2 ) << endl; } else { klucz2 = ""; pom2 = slowo.size(); for( int i = 0; i < pom2; i++ ) { pom = i % slowo2.size(); klucz2 += slowo2[ pom ]; } plik3 << koduj( slowo, klucz2 ) << endl; } } plik.close(); plik2.close(); plik3.close(); return 0; }
|
|
Admixior |
» 2013-10-27 16:49:27 Mogę zwrócić na dwie rzeczy uwagę. 1. ścieżki w windowsie pisze się od odwrotnych ukośników i pisze się je (w c++) podwójnie. 2. eof jest zgłaszany dopiero po tym jak nie ma już niczego do odczytania i ty spróbujesz jeszcze coś odczytać! |
|
pekfos |
» 2013-10-27 17:17:59 1. ścieżki w windowsie pisze się od odwrotnych ukośników i pisze się je (w c++) podwójnie. |
Można także od 'zwykłych ukośników'. |
|
Don_Corleone Temat założony przez niniejszego użytkownika |
» 2013-10-27 21:26:35 Admixior mógł byś rozwinąć swoją wypowiedź co do punktu 2? |
|
Admixior |
» 2013-10-28 09:28:25 Przedostatnie okrążenie pętli: pobierasz dane z obu plików (dostajesz poprawne słowa) - w plikach już nic nie ma, ale eof'a dalej nie ma wykonujesz dalej polecenia - kodowanie sprawdzasz czy jest eof (w while(!plik.eof() ) - nie ma, pomimo że w plikach nic nie ma
Ostatnie okrążenie pętli: pobierasz dane - oba stringi są puste i dopiero teraz ustawiana jest flaga eof pracujesz na pustych stringach
więc eof musisz sprawdzić po wczytaniu danych.
//to raczej nie spowoduje usunięcia błędu, bo wszędzie dzielenie przez zero masz ograniczone pętlami które się nigdy nie wykonają :p ale warto o takim czymś wiedzieć.
//możesz po każdej pętli zrobić plik3.flush(); wtedy zobaczysz ile linijek zostało przetworzone i przy której się zacięło.
//oczywiście zakładam że oba pliki mają tyle samo linijek z jakimikolwiek danymi w każdej. |
|
Don_Corleone Temat założony przez niniejszego użytkownika |
» 2013-10-28 16:55:52 Okej już znalazłem błąd, kod był dobry ale pliki były w złym miejscu zapisane. Admixior czyli jak powinienem odczytywać te pliki żeby nie wczytywało ostatniego elementu 2 razy? |
|
pekfos |
» 2013-10-28 21:25:40 Sprawdzać eof() zaraz po wczytaniu. |
|
« 1 » |