Wczytywanie znaku nowej lini z pliku
Ostatnio zmodyfikowano 2012-11-13 08:49
anonim Temat założony przez niniejszego użytkownika |
Wczytywanie znaku nowej lini z pliku » 2012-11-12 20:00:50 Cześć Od dwóch dni męczę się nad czymś takim(mniej więcej ;)) #include <iostream> #include <fstream> #include <string>
int main() { char wyraz[] = "abcd\nefgh"; std::fstream plik; plik.open( "dane.txt", std::ios::in | std::ios::binary ); if( plik.good() ) { std::string napis; std::cout << "\nZawartosc pliku:" << std::endl; while( !plik.eof() ) { getline( plik, napis ); std::cout << napis << std::endl; if( wyraz == napis ) std::cout << "toże same!!!\n"; } plik.close(); } else std::cout << "Error! Nie udalo otworzyc sie pliku!" << std::endl; }
Wyraz wczytany z pliku jest teoretycznie taki sam jak char[] wyraz. Jednak przez użycie znaku nowej linii program nie rozpoznaje, że to takie same wyrazy. Ogólnie w pliku dane ma być słownik polsko-angielski. Plik wyglądałby jakoś tak: good~dobry bad~zły ugly~brzydki ... Udało mi się już napisać funkcję tłumacza (działa ona w ten sposób, że sprawdza w plik w pętli i zwraca wyraz po lub przed znakiem ~ (to zależy od języka na który tłumaczymy), jednak problem jest, kiedy wyraz wygląda np. tak: Sterowanie\n\n\n\n\nChodzenie - strzałki/nstrzelanie - myszka(...)~Movement\n\n\n\n\nMoving - arrows\nshoot - mouse(...) I mam pytanie - co zrobić ze znakami nowej linii? |
|
cyklopek11 |
» 2012-11-12 20:29:47 To nigdy nie będzie spełnione! Tablica char-ów nie równa się zmiennej std::string ! - FAKT - mój błąd. Pamiętaj również, że jak tworzysz pliki txt na Windowsie w obcych programach niż w swoim własnym każda linia (zwykle) jest zakończona bajtami 0x0D, 0x0A. Plikami tekstowymi, tworzonymi przez programy typu notatnik operuje się zwykle otwierając je tekstowo a nie binarnie. Ja na Twoim miejscu zrobiłbym tak: 1.) pliki otwierałbym tekstowo pamiętając, że koniec linii to 0x0D, 0x0A 2.) zamiast użycia spacji pomiędzy złożonymi wyrażeniami używałbym w pliku _ 3.) po wczytaniu w pliku zamieniałbym ją na spację 4.) spację natomiast w pliku wykorzystałbym do oddzielania słowkoWjęzykuA słówkoWjęzykuB. 5.) Poszczególne linie wczytujesz sobie getline() do stringów i po kłopocie |
|
Mrovqa |
» 2012-11-12 20:52:22 if( wyraz == napis ) To nigdy nie będzie spełnione! Tablica char-ów nie równa się zmiennej std::string ! |
Nie pisz na forum niczego, czego nie jesteś pewien. Lepszy jest brak informacji niż dezinformacja. Sprawdź sobie porównanie std::string i char* - to nie jest porównanie na zasadzie char* z char*. Słyszałeś o czymś takim, co się zwie przeładowanie operatorów? /edit: @autor getline wczytuje Ci jedną linię (używasz domyślnego znaku terminatora - '\n'), a porównujesz wczytany tekst z ciągiem, który zawiera '\n'. Nigdy Twój warunek nie zostanie spełniony. |
|
anonim Temat założony przez niniejszego użytkownika |
» 2012-11-13 08:49:14 sorry, ale tego "1.) pliki otwierałbym tekstowo pamiętając, że koniec linii to 0x0D, 0x0A" niezbyt rozumiem" std::string translate( std::string string, std::string tl, std::string dictionaryName ) { std::string retString; std::ifstream plik; std::string napis; plik.open( "dane.txt", std::ios::in ); if( plik.good() ) { while( !plik.eof() ) { getline( plik, napis ); for( unsigned int i = 0; i < napis.size(); i++ ) { if( napis[ i ] == '~' ) { if( tl == "ENGTOPOL" ) { if( kopiuj( 0, i, napis ) == string ) { retString = kopiuj( i + 1, napis.size(), napis ); return retString; break; } } else if( tl == "POLTOENG" ) { if( kopiuj( i + 1, napis.size(), napis ) == string ) { retString = kopiuj( 0, i, napis ); return retString; break; } } else if( tl != "ENGTOPOL" and tl != "POLTOENG" ) { std::string retstringaaa = "Nie ma tłumaczenia w tych językach!!!\n"; return retstringaaa; } } } } } else std::cout << "Error! Nie udalo otworzyc sie pliku!" << "\n"; plik.close(); return string; }
to jest funkcja tłumacząca z pliku, użycie np: std::string cos = translate( string.GetText(), "ENGTOPOL", "dane.txt" );
I jak dodać obsługę znaków nowej linii? |
|
« 1 » |