Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zmiana nazw plików (tworzenie pliku) polskie znaki.

Ostatnio zmodyfikowano 2015-01-11 23:21
Autor Wiadomość
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ę.
C/C++
#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; //źle skopiowało (forum nie obsługuje do konca znaku), ale utowrzony plik blad pokaże
        case 'Ł': x[ i ] = 'Ł'; break; //źle skopiowało (forum nie obsługuje do konca znaku), ale utowrzony plik blad pokaże
        case 'Ń': x[ i ] = 'Ń'; break; //źle skopiowało (forum nie obsługuje do konca znaku), ale utowrzony plik blad pokaże
        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ą: Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń
P-124027
Krump
Temat założony przez niniejszego użytkownika
» 2015-01-03 22:56:58
Próbowałem już rzutowania tego, wywala aplikacje:
C/C++
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" ); //zmiana
const char * zmieniona = dozmiany.c_str(); //zmiana
blad.open( zmieniona ); //zmiana
wy << "Ą ą Ć ć Ę ę Ł ł Ó ó Ś ś Ż ż Ź ź Ń ń" << endl;
wy << dana << endl << pol( dana );
blad.close();
we.close();
wy.close();
P-124028
SocrateZ
» 2015-01-04 00:40:23
Plik masz zapisany w jakim kodowaniu? UTF-8?
P-124042
Krump
Temat założony przez niniejszego użytkownika
» 2015-01-04 00:50:53
Notepad++ tak pokazuje. UTF-8
P-124045
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.
P-124046
SocrateZ
» 2015-01-04 01:05:00
Zmień na ANSI w Notepad++.
P-124048
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
P-124050
SocrateZ
» 2015-01-04 01:07:54
No więc przerób funkcje na obsługę wchar_t.

Tutaj przykład który chodzi:
C/C++
#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-g

Tylko ż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.
P-124051
« 1 » 2 3 4 5
  Strona 1 z 5 Następna strona