Plik txt a ComboBox

dział ogólny

Plik txt a ComboBox

Nowy postprzez rafalskraba » niedziela, 11 października 2009, 21:58

Witam, chcę do ComboBoxa wczytać dane z pliku tekstowego. Poniżej zamieszczam przyklad takiego pliku
dane a dane b
0.3 0.5
0.5 0.75 0.85 1.36
0.75 1.0 1.12 2.67 4.87

Dane a bedą ładowane do jednego ComboBoxa natomiast dane b sa zapisywane w drugim ComboBoxie. Dane b posiadają rózną liczbę wartości .
"Jednym z rodzajów szczęśliwości jest zdolność podejmowania dobrych decyzji."

- Platon-
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez Corvis » poniedziałek, 12 października 2009, 00:17

No i ??
"Sukcesy trwają, dopóki ich ktoś nie spieprzy. Porażki są wieczne"

Dr Gregory House
Avatar użytkownika
Corvis
Programista I
Programista I
 
Posty: 880
Dołączył(a): sobota, 26 lipca 2008, 00:31
Podziękował : 80
Otrzymał podziękowań: 30
System operacyjny: WINDOWS 7 64-bity
Kompilator: Praca - C++ Builder XE2 ENTERPRISE - Update 4, Dom - C++ Builder XE4 - Uddate 1
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez Cyfrowy Baron » poniedziałek, 12 października 2009, 10:14

dane a dane b
0.3 0.5
0.5 0.75 0.85 1.36
0.75 1.0 1.12 2.67 4.87


Które to są dane a a które b, bo ja ich nie odróżniam, widzę tylko listę z liczbami. Pliki tekstowe do ComboBox wczytuje się tak:

Kod: Zaznacz cały
ComboBox1->Items->LoadFromFile("c:\\plik.txt");
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez polymorphism » poniedziałek, 12 października 2009, 11:14

Przykładowy kod z użyciem strumienia ifstream:
Kod: Zaznacz cały
ifstream is("[jakaś ścieżka]");
   
double a,b;
int c;

while(is >> a) //<---------- czytasz A
{
   cout << "a=" << a << '\n';
   while(is)
   {
      while((c = is.rdbuf()->sgetc()) != '\n' && isspace(c))is.rdbuf()->snextc();
      if(c == '\n' || c == EOF)break;
      is >> b; //<---------- czytasz kolejne B
      cout << "\tb=" << b << '\n';
   }
}




PS. z drugiej strony, jeśli chcesz te wartości dodawać do combobox'a, sensowniej byłoby czytać te liczby jako tekst niż liczby double - zmień double na string.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez rafalskraba » wtorek, 13 października 2009, 10:32

Z uwago na to iż nieczytelnie podałem wartości poszczególnych danych przedstawię je w następujący sposób:
0.3 # 0.5
0.5 # 0.75 $ 0.85 $ 1.36
0.75 # 1.0 $ 1.12 $ 2.67 $ 4 4.87

# - do tego znaku dane są wpisywane do jednego ComboBoxa dane znajdujące sie za znakiem # są wpisywane do drugiego ComboBoxa
$ - rozdzielenie poszczególnych danych w drugim ComboBoxsie
czyli np wybierając z BomboBox1 wartość 0.5 w drugim ComboBox mam mieś do wyboru następujące wartości: 0,75 0,85 1,36
Avatar użytkownika
rafalskraba
Intelektryk
Intelektryk
 
Posty: 122
Dołączył(a): czwartek, 5 marca 2009, 10:20
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Windows 7 x64
Kompilator: RAD Studio XE2 Update 4 HotFix 1
SKYPE: rafal.skraba
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez polymorphism » wtorek, 13 października 2009, 10:41

Wystarczająco czytelnie podałeś. Kod już dostałeś, wystarczy go sobie przystosować do własnych potrzeb.
C++ Reference - opis wszystkich klas STL-a i funkcji C.
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez Cyfrowy Baron » wtorek, 13 października 2009, 12:58

Tak! Teraz jest to zrozumiałem, gdyż potrzebny jest jakiś separator, który rozdzieli jedne dane od drugich. Znak równości byłby lepszy gdyż klasa TStringList, którą posłużę się w przykładzie oferuje gotowe funkcje dla tego znaku, ale może być tak jak podałeś. Rozwiązanie jest nader proste.

Najpierw wczytujemy zawartość pliku do globalnej listy typu TStringList, musi być globalna, gdyż przechowuje całą zawartość pliku. Przechowywanie zawartości pliku jest niezbędne, gdyż zawartość obiektu ComboBox2 (jak rozumiem) jest zależna od tego co zostanie wybrane na liście ComboBox1. Lista ComboBox1 ma zawierać Dane_A, które są przechowywane w globalnej liście Lista_Dane_AB, następnie funkcja WydzielDaneA, wydziela z tej listy Dane_A, które poprzez argument funkcji są wpisywane do ComboBox1. Po wybraniu elementu z listy ComboBox1, do listy ComboBox2 poprzez funkcję WydzielDaneB są wydzielane i przepisywane Dane_B powiązane z danymi Dane_A. Do wybierania danych z ComboBox1 można posłużyć się zdarzeniem OnClick lub OnSelect.


...i to chyba wszystko...

Plik nagłówkowy np. Unit1.h:
Kod: Zaznacz cały
private:   // User declarations
    void __fastcall WydzielDaneA(String FileName, TStrings *Dane_A);
    void __fastcall WydzielDaneB(String Dane_A, TStrings *Dane_B);
    TStrings *Lista_Dane_AB;



Plik źródłowy np. Unit1.cpp:
Kod: Zaznacz cały
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) // konstruktor klasy formularza
            : TForm(Owner)
{
   Lista_Dane_AB = new TStringList();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WydzielDaneA(String FileName, TStrings *Dane_A)
{
   if(!FileExists(FileName))
   {
    char WindowName[MAX_PATH];
    GetWindowText(Application->ActiveFormHandle, WindowName, sizeof(WindowName));

    Application->MessageBox(("Nie odnaleziono pliku: \"" + FileName + "\"").c_str(),
                           WindowName, MB_OK | MB_ICONINFORMATION);
    return;
   }

   Dane_A->Clear();

   Lista_Dane_AB->LoadFromFile(FileName);

   for(int i = 0; i < Lista_Dane_AB->Count; i++)
   {
    String tmpText = Lista_Dane_AB->Strings[i];
    int x = tmpText.Pos("#");
    Dane_A->Add(tmpText.SubString(1, x - 1).Trim());
   }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::WydzielDaneB(String Dane_A, TStrings *Dane_B)
{
   for(int i = 0; i < Lista_Dane_AB->Count; i++)
   {
    String tmpText = Lista_Dane_AB->Strings[i];
    int x = tmpText.Pos("#");

    String result = tmpText.SubString(1, x - 1).Trim();

    if(Dane_A.LowerCase() == result.LowerCase())
    {
     Dane_B->Clear();
     String tmpDane_B = tmpText.SubString(x + 1, tmpText.Length()).Trim();
     x = 0;

     for(int j = 0; j < tmpDane_B.Length(); j++)
     {
       x = tmpDane_B.LastDelimiter("$");
       tmpText = tmpDane_B.SubString(x + 1, tmpDane_B.Length()).Trim();
       if(!tmpText.IsEmpty()) Dane_B->Add(tmpText);
       tmpDane_B = tmpDane_B.Delete(x, tmpDane_B.Length());
       if(x == 0) return;
     }
     return;
    }
  }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
/* wczytanie danych z pliku do listy Lista_Dane_AB oraz wydzielenie danych Dane_A do ComboBox1 */
{
   String fileName = ExtractFilePath(ParamStr(0)) + "dane.txt";

   WydzielDaneA(fileName, ComboBox1->Items);

   ComboBox2->Items->Clear();
   ComboBox1->ItemIndex = -1;
   ComboBox2->ItemIndex = -1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ComboBox1Click(TObject *Sender) /* zdarzenie ComboBox1 OnClick, może też byc OnSelect */
/* Wydzielenie danych Dane_B do ComboBox2 poprzez wybranie elementu listy ComboBox1 */
{
   String Value = ComboBox1->Items->Strings[ComboBox1->ItemIndex];
   WydzielDaneB(Value, ComboBox2->Items);
   ComboBox2->ItemIndex = -1;
}
//---------------------------------------------------------------------------


Kod pisałem na szybkiego, ale testowałem i u mnie działa bez zarzutu.

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
rafalskraba
Avatar użytkownika
Cyfrowy Baron
Administrator
Administrator
 
Posty: 4716
Dołączył(a): niedziela, 13 lipca 2008, 15:17
Podziękował : 12
Otrzymał podziękowań: 442
System operacyjny: Windows 7 x64 SP1
Kompilator: Embarcadero RAD Studio XE2
C++ Builder XE2 Update 4
SKYPE: cyfbar
Gadu Gadu: 0
    NieznanyNieznana

Re: Plik txt a ComboBox

Nowy postprzez kurczez » wtorek, 13 października 2009, 13:20

Od siebie dodam, że istnieje również klasa TIniFiles

Kod: Zaznacz cały
#include <IniFiles.hpp>
//...

TIniFile *ini = new TIniFile("C://Plik.txt");

AnsiString dane = ini->ReadString("Dane", "0.5", "brak danych");


Taki kod odczyta dane z pliku o zawartości:

Kod: Zaznacz cały
[Dane]
0.5=0.75 $ 0.85 $ 1.36


Pisane z palca jeśli nie działa to sprawdzę co może być nie tak.
Avatar użytkownika
kurczez
Homos antropiczny
Homos antropiczny
 
Posty: 56
Dołączył(a): sobota, 10 października 2009, 18:58
Podziękował : 4
Otrzymał podziękowań: 0
System operacyjny: Vista
Kompilator: Turbo C++
Gadu Gadu: 0
    NieznanyNieznana


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 4 gości