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

pytanie o wczytywanie znaków z tablicy znaków?
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 23
0

Witam!!!

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

Kopiuj
#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.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
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ń:

Kopiuj
               if (i ==5)
                  {

                   wsp=wsp+1;

                  }

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

na:

Kopiuj
wsp+=(i ==5)||(i ==23);
KR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 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.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.