Krump Temat założony przez niniejszego użytkownika |
[C++] Zmiana nazw plików (tworzenie pliku) polskie znaki. » 2015-01-03 22:42:38 Witam, Programuje w CodeBlocks 13.12 Mam problem z dość znaną sprawą. Nie znalazłem nigdzie żadnej odpowiedzi która by działała dlatego pisze. Robię dość potężna aplikację, która zmienia nazwy plików i cała działa po za tym małym szkopułem. WAŻNE! Nie używam funkcji system("rename"), tylko właściwej dla rodziny C rename(); Otóż wszystkim znanie wyświetlanie krzaków w konsoli czy wpisywane do pliku przy polskich znakach. Niestety nie do końca to jest moim problemem, gdyż na to mam swoja zawsze działająca metodę. Problem jest przy używaniu funkcji rename(), bądź po prostu tworzenia pliku z polskimi literami. Jak to zrobić, aby działało. U mnie w aplikacji pobierane nazwy na które mają się zmieniać nazwy plików są pobierane z pliku txt. Co ciekawe CodeBlock sam zmienia krzaki na nazwy, ale juz w przypadku tych funkcji tego nie robi. Oto przykładowy program, który obrazuje tę sytuację. #include <iostream> #include <fstream>
string pol( string x ) { int n = x.size(); for( int i = 0; i < n; i++ ) { switch( x[ i ] ) { case 'Ä„': x[ i ] = 'Ą'; break; case 'Ć': x[ i ] = 'Ć'; break; case 'Ä': x[ i ] = 'Ę'; break; case 'Ĺ': x[ i ] = 'Ł'; break; case 'Ĺ': x[ i ] = 'Ń'; break; case 'Ă“': x[ i ] = 'Ó'; break; case 'Ĺš': x[ i ] = 'Ś'; break; case 'Ĺą': x[ i ] = 'Ź'; break; case 'Ĺ»': x[ i ] = 'Ż'; break; case 'Ä…': x[ i ] = 'ą'; break; case 'ć': x[ i ] = 'ć'; break; case 'Ä™': x[ i ] = 'ę'; break; case 'Ĺ‚': x[ i ] = 'ł'; break; case 'Ĺ„': x[ i ] = 'ń'; break; case 'Ăł': x[ i ] = 'ó'; break; case 'Ĺ›': x[ i ] = 'ś'; break; case 'Ĺş': x[ i ] = 'ź'; break; case 'ĹĽ': x[ i ] = 'ż'; break; } } return x; }
int main( int argc, char ** argv ) { ifstream we; we.open( "dane.txt" ); ofstream wy, blad; string dana; getline( we, dana ); cout << dana << endl << pol( dana ); wy.open( "test.txt" ); blad.open( "Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń.txt" ); wy << "Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń" << endl; wy << dana << endl << pol( dana ); blad.close(); we.close(); wy.close(); }
w pliku dane.txt jest jedna linia z treścią: Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń |
|
Krump Temat założony przez niniejszego użytkownika |
» 2015-01-03 22:56:58 Próbowałem już rzutowania tego, wywala aplikacje: ifstream we; we.open( "dane.txt" ); ofstream wy, blad; string dana; getline( we, dana ); cout << dana << endl << pol( dana ); wy.open( "test.txt" ); string dozmiany = pol( "Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń.txt" ); const char * zmieniona = dozmiany.c_str(); blad.open( zmieniona ); wy << "Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń" << endl; wy << dana << endl << pol( dana ); blad.close(); we.close(); wy.close();
|
|
SocrateZ |
» 2015-01-04 00:40:23 Plik masz zapisany w jakim kodowaniu? UTF-8? |
|
Krump Temat założony przez niniejszego użytkownika |
» 2015-01-04 00:50:53 Notepad++ tak pokazuje. UTF-8 |
|
Kaikso |
» 2015-01-04 00:51:48 Po co jest funkcja pol()? Pewnie w Code::Blocks masz kodowanie Windows-1250. Zmień je na UTF-8 i powinno być dobrze: Settings->Editor->General Settings tam masz "Use encoding when opening files:" zmień na UTF-8. |
|
SocrateZ |
» 2015-01-04 01:05:00 Zmień na ANSI w Notepad++. |
|
Krump Temat założony przez niniejszego użytkownika |
» 2015-01-04 01:07:08 Nie moge zmienić na ANSI ponieważ za dużo plików dostaje i nie będę zmieniał teraż każdego w NotPadzie, dlatego robię ten program, aby go odpalać i mieć z głowy. funkcja pol() zmienia znaki na odpowiednie. Własnie szukałem takiej funkcji, ale nie znalazłem jej w ustawieniach, zaraz ci podeślę screen'a. https://www.dropbox.com/s/9ow09cml0gyj6qb/2015-01-04_01h10_47.png?dl=0 |
|
SocrateZ |
» 2015-01-04 01:07:54 No więc przerób funkcje na obsługę wchar_t. Tutaj przykład który chodzi: #include <string>
int main( int argc, char ** argv ) { FILE * file = NULL; int sign = 0; int x = 0; char aca[ 50 ]; file = fopen( "dane.txt", "r" ); if( !file ) return 1; while(( sign = fgetc( file ) ) != EOF ) { aca[ x++ ] = sign; } aca[ x ] = '\0'; fclose( file ); file = NULL; printf( "%s\n", aca ); file = fopen( "test.txt", "w" ); if( !file ) return 1; fclose( file ); rename( "test.txt", aca ); getchar(); return 0; } W pliku dane.txt po prostu wpisujesz w ANSII swój ciąg znaków, np Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń.txt Plik dane.txt musi być wcześniej utworzony. PS: Na windowsie jest _wrename - dla wchar_t, no ale linuks... http://stackoverflow.com/questions/6442045/equivalent-of-msvc-wrename-in-linux-gTylko że wcześniej musiałbyś wstawić do powyższego kodu fgetwc zamiast fgetc i zapisywać do tablicy wchar_t. Oczywiście dla UNICODE koniec pliku to WEOF a nie EOF. |
|
« 1 » 2 3 4 5 |