mrukat990 Temat założony przez niniejszego użytkownika |
Konwersja pliku tekstowego » 2017-08-13 17:58:46 Piszę program, który wykona konwersję pliku tekstowego zamieniając małe litery na duże i duże na małe. Niestety program nie zamienia właściwie tekstu. Gdzie popełniam błąd? using namespace std; char zamien( char c ) { if( c == toupper( c ) ) { c = tolower( c ); } else { c = toupper( c ); } return c; }
int main() { char c; fstream wejscie, wyjscie; wejscie.open( "dane.txt", ios::in ); wyjscie.open( "zmienione.txt", ios::out ); if( wejscie.good() && wyjscie.good() ) { while( !wejscie.eof() ) { wejscie.get( c ); c = zamien( c ); wyjscie.put( c ); } } wejscie.close(); wyjscie.close(); return 0; }
|
|
Kinexity |
» 2017-08-13 18:35:03 #include <fstream> using namespace std;
char zamien( char c ) { return( c == toupper( c ) ? tolower( c ) : toupper( c ) ); }
int main() { char c; fstream wejscie( "dane.txt", ios::in ), wyjscie( "zmienione.txt", ios::out ); if( wejscie.is_open() && wyjscie.is_open() ) { wejscie.seekg( ios_base::beg ); wyjscie.seekp( ios_base::beg ); while( !wejscie.eof() ) { wejscie >> c; wyjscie << zamien( c ); } } wejscie.close(); wyjscie.close(); return 0; } - w takiej postaci działa dobrze w VS2017 |
|
j23 |
» 2017-08-13 18:45:17 "nie zamienia właściwie tekstu" czyli co jest źle? Popraw pętle na: while( wejscie.get( c ) ) { wyjscie.put( zamien( c ) ); }
Zamiast if( c == toupper( c ) ) { ... } daj if( isupper( c ) ) { ... }Jeśli problemem są polskie znaki, to na początku main daj wywołanie setlocale(LC_CTYPE, ".1250"); (1250 to kodowanie znaków, może być inne). |
|
mrukat990 Temat założony przez niniejszego użytkownika |
» 2017-08-13 18:56:29 Dziękuję bardzo za pomoc. Program dzięki Wam działa prawidłowo. Czy można by ten program napisać wykorzystując klasę string? |
|
j23 |
» 2017-08-13 19:13:50 Można: string s = "ęąśhggfWERds";
transform( s.begin(), s.end(), s.begin(),[]( char c ) { return isupper( c ) ? tolower( c ) : toupper( c ); } ); |
|
mrukat990 Temat założony przez niniejszego użytkownika |
» 2017-08-13 20:58:37 Przy kompilacji Code::Blocks zgłasza błąd dotyczący transform: D:\C++\xxx\main.cpp|26|error: no matching function for call to 'transform(std::basic_string<char>::iterator, std::basic_string<char>::iterator, std::basic_string<char>::iterator, main()::<lambda(char)>)'|
|
|
Monika90 |
» 2017-08-13 21:09:47 @j23 Argument dla toupper, tolower, isupper, itp. musi mieć wartość z zakresu typu unsigned char lub być równy EOF, polskie litery nie spełniają tego warunku w implementacjach w których char jest typem ze znakiem.
|
|
mrukat990 Temat założony przez niniejszego użytkownika |
» 2017-08-13 21:14:26 Zmieniłem string s tak aby nie zawierał polskich znaków i też zgłasza błąd jak wcześniej. |
|
« 1 » 2 |