Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

[C++] kodowanie w plikach txt

04 Mar 2010 20:47 4506 9
  • #1
    User removed account
    User removed account  
  • #2
    Dżyszla
    Level 42  
    proponuję zapisać sobie w notatniku przykładowy a następnie otworzyć w edytorze szesnastkowym ;)

    Zakładam, że posługujesz się kompilatorem bez wsparcia UTF8 i pod DOS - wówczas musisz sam dokonywać odpowiedniego zapisu. W Windows jest WideChar/WidePChar.
  • #3
    User removed account
    User removed account  
  • #5
    User removed account
    User removed account  
  • #6
    Akane
    Level 27  
    Jest pewien problem - musisz znać kodowanie w pliku wejściowym. Jeśli go nie znasz, a plik jest zapisany w unicode, to nie będzie problemu.
    Do zmiany kodowania są funkcje:
    * MultibyteToWideChar: cokolwiek -> unicode LE
    * WideCharToMultibyte: unicode LE -> cokolwiek
    cokolwiek: ansi, utf8, ... cokolwiek znajdziesz na ostatniej zakładce w intl.cpl

    Kodowanie pliku, jak wyżej napisano, oznacza się kilkoma bajtami na samym początku (wybierz jedno):

    Code:
    WriteToFile(hFile, "\xEF\xBB\xBF", 3); // UTF8
    
    WriteToFile(hFile, "\xFF\xFE", 2); // unicode LE (domyślny)
    WriteToFile(hFile, "\xFE\xFF", 2); // unicode BE
    // brak znaków // ansi


    Zakładając że plik wejściowy ma kodowanie ansi a wyjściowy utf8, piszesz:
    Code:
    char *pszAnsi;
    

    while (czytaj(file, &pszAnsi))
    {
       int ansiLen = strlen(pszAnsi);
       int UnicodeLen = (ansiLen*2)+1;
       WCHAR *pszUnicode = new WCHAR[UnicodeLen];
       // ansi -> unicode
       MultiByteToWideChar(CP_ACP, 0, pszAnsi, -1, pszUnicode, UnicodeLen);
       // unicode -> utf8
       // ** liczba znaków może być większa nawet od ansiLen*2
       // więc pytamy o rozmiar bufora (uwzględia końcowe NULL)
       int utf8Len = WideCharToMultiByte(CP_UTF8, 0, pszUnicode, -1, 0, 0, 0, 0);
       // if (!utf8Len) error();
       char *pszUtf8 = new char[utf8Len];
       WideCharToMultiByte(CP_UTF8, 0, pszUnicode, -1, pszUtf8, utf8Len, 0, 0);
       delete pszUnicode;
       zapisz(file, pszUtf8, utf8Len-1); // -1: bez końcowego NULL
       delete pszUtf8;
    }
  • #7
    FirstStep
    Level 12  
    Do dzielenia tekstu możesz użyć tego przykładu, żeby z wcharów skorzystać zrób np. szablon.
    Code:

    #include <iostream>
    #include <string>
    #include <vector>

    using namespace std;

    void split(const string& s, char c, vector<string>& v)
    {
            string::size_type i=0;
            string::size_type j=s.find(c);
           
            while(j != string::npos)
            {
                    v.push_back(s.substr(i,(j-i)));
                    i=++j;
                    j=s.find(c,j);
                   

                    if (j == string::npos)
                    {
                            v.push_back(s.substr(i, s.length()));
                           
                    }
            }
    }
     
    int main()
    {
            vector<string> v;
            string s="Nazwa konta|Adres 1| Adres 2| Miasto";

            split(s,'|',v);

            for(int i=0; i < v.size(); ++i)
            {
                    cout << v[i] <<"\n";
            }

           


       system("Pause");
       return 0;
    }
  • #8
    User removed account
    User removed account  
  • #9
    User removed account
    User removed account  
  • #10
    User removed account
    User removed account