pytanie o wczytywanie znaków z tablicy znaków?

0

Witam!!!

Tutaj załączam kod programu robionego w C ++ Builderze(z pakietu Borland RAD Studio XE3):

#include <vcl.h>
#include <string.h>
#include <iostream.h>
#include <fstream.h>

#pragma hdrstop

using namespace std;

#include "baza2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

TForm1 *Form1;
fstream strumien;

//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
  StringGrid1->ColWidths[0] = 56;
  StringGrid1->ColWidths[1]= 102;
  StringGrid1->ColWidths[2] = 500;
  char linia[255];

  string ww;
  strumien.open("BazaCD.txt",ios::in|ios::out|ios::app);
  int wsp=0,licznik = 0;
  while (! strumien.eof() )
    {
     strumien.getline(linia,sizeof(linia));

     StringGrid1->RowCount = StringGrid1->RowCount+1;
     for (int i = 0; i < strlen(linia) ; i++)
       {
        Label1->Caption =Label1->Caption+linia[i];
        StringGrid1->Cells[wsp][licznik] = StringGrid1->Cells[wsp][licznik] + linia[i];
        if (i ==5)
          {
           wsp=wsp+1;
          }

        if (i ==23)
          {
           wsp=wsp+1;
          }
       }
     wsp=0;
     licznik = licznik+1;
    }
    StringGrid1->RowCount = StringGrid1->RowCount -1;
    strumien.close();

I związku z tym pytanie: Gdy wczytuje cały łańcuch tablicy znaków pobrany z pliku do StringGrida czy etykiety(tutaj Label1) to wyświetla mi prawidłowo wszystkie znaki nawet polskie, ale gdy próbuję robić to wczytując znak za znakiem,
to wywala mi przy polskich literach krzaczki, zatem jeśli ktoś ma pomysł jak ominąć ten problem wczytywaniem znaku za znakiem, niech mi pomoże. Proces wczytywania uprościłem, gdyż poprzednia wersja wczytywania danych z pliku mimo,że działała prawidłowo to miała nadmiar zmiennych, a chciałem mieć bardziej przejrzysty kod.

1

Skonwertuj to na UnicodeString; a potem dopiero dziel.
Poza tym nie zbyt rozumiem po kiego ci pętla, czemu nie zrobić:
UnicodeString U=linia; // tu zależy od twego pliku, może trzeba dać Utf8ToUnicode lub czegoś w tym rodzaju.
StringGrid1->Cells[0][licznik] =Copy(U,1,5);
StringGrid1->Cells[1][licznik] =Copy(U,6,18);
StringGrid1->Cells[2][licznik] =Copy(U,24,1000);
Jeżeli chcesz "mieć bardziej przejrzysty kod" to zamień:

               if (i ==5)
                  {

                   wsp=wsp+1;

                  }

                if (i ==23)
                  {
                   wsp=wsp+1;
                  }

na:

wsp+=(i ==5)||(i ==23);
0

Dzięki za szybką odpowiedź. Sprawdzę jutro twoje rozwiązanie. Że też nie wpadłem na ten pomysł sam.
Cóż, nie ma funkcji Copy w C++, gdyż takowa istnieje tylko w Delphi, jest za to Substring i znalazłem rozwiązanie:
dodajemy zmienną:
String StringUnicodowy;

a w pętla wygląda teraz tak:
while (! strumien.eof() )
{
strumien.getline(linia,sizeof(linia));
StringUnicodowy = linia;
StringGrid1->RowCount = StringGrid1->RowCount+1;
for (int i = 0; i < strlen(linia) ; i++)
{
Label1->Caption = (StringUnicodowy.SubString(1,5));
StringGrid1->Cells[0][licznik] =(StringUnicodowy.SubString(1,5)); // Nawiasy zewnętrzne konieczne inaczej wywali błąd przy kompilacji
StringGrid1->Cells[1][licznik] =(StringUnicodowy.SubString(7,18));
StringGrid1->Cells[2][licznik] =(StringUnicodowy.SubString(25,255));
if ((i ==5) || (i ==23))
{
wsp++;
}

   }
 wsp=0;
 licznik = licznik+1;
}

reszta bez zmian.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0