problem z wczytaniem pliku tekstowego po uprzednim pomyleniu nazwy
Ostatnio zmodyfikowano 2015-01-14 00:10
bensik Temat założony przez niniejszego użytkownika |
problem z wczytaniem pliku tekstowego po uprzednim pomyleniu nazwy » 2015-01-12 20:43:57 Mam takie coś: #include <iostream> #include <string> #include <fstream> #include <windows.h>
using namespace std;
void zwykle_znaki( string & S ) { for( int i = 0; i < S.size(); i++ ) { switch( S[ i ] ) { case ' ': S[ i ] = 'X'; break; case 'a': S[ i ] = 'A'; break; case 'A': S[ i ] = 'A'; break; case 'Ą': S[ i ] = 'A'; break; case 'ą': S[ i ] = 'A'; break; case 'b': S[ i ] = 'B'; break; case 'B': S[ i ] = 'B'; break; case 'c': S[ i ] = 'C'; break; case 'C': S[ i ] = 'C'; break; case 'Ć': S[ i ] = 'C'; break; case 'ć': S[ i ] = 'C'; break; case 'd': S[ i ] = 'D'; break; case 'D': S[ i ] = 'D'; break; case 'e': S[ i ] = 'E'; break; case 'E': S[ i ] = 'E'; break; case 'Ę': S[ i ] = 'E'; break; case 'ę': S[ i ] = 'E'; break; case 'f': S[ i ] = 'F'; break; case 'F': S[ i ] = 'F'; break; case 'g': S[ i ] = 'G'; break; case 'G': S[ i ] = 'G'; break; case 'h': S[ i ] = 'H'; break; case 'H': S[ i ] = 'H'; break; case 'i': S[ i ] = 'I'; break; case 'I': S[ i ] = 'I'; break; case 'j': S[ i ] = 'J'; break; case 'J': S[ i ] = 'J'; break; case 'k': S[ i ] = 'K'; break; case 'K': S[ i ] = 'K'; break; case 'l': S[ i ] = 'L'; break; case 'L': S[ i ] = 'L'; break; case 'Ł': S[ i ] = 'L'; break; case 'ł': S[ i ] = 'L'; break; case 'm': S[ i ] = 'M'; break; case 'M': S[ i ] = 'M'; break; case 'n': S[ i ] = 'N'; break; case 'N': S[ i ] = 'N'; break; case 'Ń': S[ i ] = 'N'; break; case 'ń': S[ i ] = 'N'; break; case 'o': S[ i ] = 'O'; break; case 'O': S[ i ] = 'O'; break; case 'Ó': S[ i ] = 'O'; break; case 'ó': S[ i ] = 'O'; break; case 'p': S[ i ] = 'P'; break; case 'P': S[ i ] = 'P'; break; case 'r': S[ i ] = 'R'; break; case 'R': S[ i ] = 'R'; break; case 's': S[ i ] = 'S'; break; case 'S': S[ i ] = 'S'; break; case 'Ś': S[ i ] = 'S'; break; case 'ś': S[ i ] = 'S'; break; case 't': S[ i ] = 'T'; break; case 'T': S[ i ] = 'T'; break; case 'u': S[ i ] = 'U'; break; case 'U': S[ i ] = 'U'; break; case 'w': S[ i ] = 'W'; break; case 'W': S[ i ] = 'W'; break; case 'y': S[ i ] = 'Y'; break; case 'Y': S[ i ] = 'Y'; break; case 'z': S[ i ] = 'Z'; break; case 'Z': S[ i ] = 'Z'; break; case 'Ż': S[ i ] = 'Z'; break; case 'ż': S[ i ] = 'Z'; break; case 'Ź': S[ i ] = 'Z'; break; case 'ź': S[ i ] = 'Z'; break; case 'v': S[ i ] = 'V'; break; case 'V': S[ i ] = 'V'; break; case 'q': S[ i ] = 'Q'; break; case 'Q': S[ i ] = 'Q'; break; default: S[ i ] = 'X'; break; } } }
int main() { fstream haczyk; string tekst, nazwa; cout << "Podaj sciezke do pliku ktory chcesz otworzyc, lub w przypadku, gdy znajduje sie on w tym samym folderze co program podaj jego nazwe. \nNie zapomnij o rozszerzeniu .txt: \n" << endl; jeszczeRaz2: cin >> nazwa; haczyk.open( nazwa.c_str(), ios::in ); if( haczyk.good() == true ) { std::cout << "Posiadasz dostep do pliku!\n" << std::endl; ofstream nowyTekst( "nowyTekst.txt" ); while( haczyk.good() ) { getline( haczyk, tekst ); zwykle_znaki( tekst ); nowyTekst << tekst << endl; cout << tekst << endl; } haczyk.close(); } else { cout << "Dostep do pliku nie jest mozliwy. \nSprawdz czy podana nazwa / sciezka jest poprawna. \nJesli wpisywales sama nazwe to upewnij sie ze dany plik znajduje sie w tym samym folderze co program !\n\n" << std::endl; goto jeszczeRaz2; } Program ma za zadanie wczytać jakiś plik o podanej przez użytkownika nazwie, podmienić znaki i zapisać to do pliku "nowyTekst". W przypadku podania złej nazwy pliku do odczytu, program powinien wyświetlić komunikat "Dostep do pliku nie jest...." i ponowić możliwość wpisania nazwy pliku. Program ładnie podmienia znaki i zapisuje cały tekst w nowym pliku. Problem pojawia się jednak kiedy użytkownik pomyli się i wpisze złą nazwę pliku tekstowego, który ma zostać odczytany. Owszem pojawia się wtedy komunikat: "Dostep do pliku nie jest....", jednakże potem nie da się już wczytać żadnego pliku. Nawet takiego o poprawnej nazwie, który bez problemu wczytywany jest za pierwszym podejściem. Próbowałem czyścić strumień wejścia wpisując przed nim cin.clear(); i cin.sync(); ale nic to nie dało. Ktoś wie co tu jest nie halo ? ps dodam że to dopiero moje początki z programowaniem więc proszę się nie śmiać z tego co jest tam napisane :) |
|
Monika90 |
» 2015-01-12 22:10:09 Można dopisać haczyk.clear(); przed goto jeszczeRaz2;, a moze lepiej zrezygnować z goto i napisać to porządnie. |
|
bensik Temat założony przez niniejszego użytkownika |
» 2015-01-14 00:10:26 Głowę dał bym sobie odciąć że próbowałem tak zrobić ;p W każdym razie dziękuje Moniko ponieważ pomogło.
Pisząc "napisać to porządnie" masz na myśli pętle tak ? |
|
« 1 » |