CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Odczyt zapis znaków w komponecie Edit

Odczyt zapis znaków w komponecie Edit

dział ogólny

Odczyt zapis znaków w komponecie Edit

Nowy postprzez moderasura » sobota, 7 stycznia 2012, 20:03

Witam! To ja z tej strony :D...mam pewien problem z zapisem danych do pliku z komponentu (Edit) Kombinowałem na różne sposoby zapis do pliku ale coś mi to nie działa ;/...Z odczytaniem pliku i jego zawartości nie ma problemu tylko problem jest z zapisem mam o to taki kod
KOD cpp:     UKRYJ  
// ---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <stdio.h>
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

// char v[89432];

char v[12];

TForm1 *Form1;

// DWORD v[89431];

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent * Owner) : TForm(Owner) {

}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {

    /* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
    String fileName = ExtractFilePath(ParamStr(0)) + "test.BIN";

    fstream infile;
    infile.open(fileName.c_str(), ios::in | ios::binary);

    infile.read((char *)&v, sizeof(v));

    if (sizeof(v) == 0 || infile == NULL) {
        ShowMessage("Plik nie istnieje lub jest pusty");
        return;
    }

    /*

     Edit1->Text = (String) v[88972]+v[88974]+v[88976]+v[88978]+v[88980]+v[88982]+v[88984]+v[88986]

     +v[88988]+v[88990]+v[88992]+v[88994]+v[88996]+v[88998]+v[89000]+v[89002]+v[89004]+v[89006]+v[89008]

     +v[89010]+v[89012]+v[89014]+v[89016]+v[89018]+v[89020]+v[89022];
*/



    // Edit1->Text = (String) v[0]+v[2]+v[4]+v[6]+v[8]+v[10]  ;

    Edit1->Text = (String) v[0];
    Edit2->Text = (String) v[2];
    Edit3->Text = (String) v[4];
    Edit4->Text = (String) v[6];
    Edit5->Text = (String) v[8];
    Edit6->Text = (String) v[10];

    infile.close();

}

// ---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender) {

    /* jeżeli EditX->Text nic nie zawiera przerwij */
    // if( Edit1->Text.IsEmpty())
    // {
    // ShowMessage("Najpierw wprowadź poprawne dane");
    // return;
    // }

    // v[0]=v[2]=v[4]=v[6]=v[8]=v[10]=v[12] = Edit1->Text.c_str()[0];     //dobry kod nie wywalac

    // v[0]=v[2]=v[4]=v[6]=v[8]=v[10] = Edit1->Text.c_str()[0];

    v[0] = Edit1->Text.c_str()[0];
    v[2] = Edit2->Text.c_str()[0];
    v[4] = Edit3->Text.c_str()[0];
    v[6] = Edit4->Text.c_str()[0];
    v[8] = Edit5->Text.c_str()[0];
    v[10] = Edit6->Text.c_str()[0];

    /*
     v[88972]=v[88974]=v[88976]=v[88978]=v[88980]=v[88982]=v[88984]=v[88986]

     =v[88988]=v[88990]=v[88992]=v[88994]=v[88996]=v[88998]=v[89000]=v[89002]=v[89004]==v[89006]==v[89008]

     ==v[89010]==v[89012]==v[89014]==v[89016]==v[89018]==v[89020]==v[89022]==Edit1->Text.c_str()[0];
*/


    /* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
    String fileName = ExtractFilePath(ParamStr(0)) + "wyjsciowe dane.DAT";

    fstream outfile;
    outfile.open(fileName.c_str(), ios::out | ios::binary);
    outfile.write((char *)&v, sizeof(v));

    outfile.close();

}

// ---------------------------------------------------------------------------

wczytuje plik 12 bajtów do komponentu Edit1 pobrane z offset i wszystko ładnie pięknie tekst sie wyświetla tylko mam problem z zapisaniem tego ;/ Podczas zapisywania do pliku określonych znaków zapisuje mi zawszy pierwszy znak np mam taką zawartość pliku M.A.T.R.Y.C.A. i wczytuje to do sześciu pól edit i jest ladnie i pieknie i zapis jest z powodzeniem...I teraz pytanie jak to zrobić by odczytaną ilość znaków zapisać to z jednego pola komponentu edit nie używając większej ilości komponentów? ...Tam gdzie są komentarze to sa moje sposoby na zapis ale nie skuteczne ;/Nie wiem czy jasno się wyraziłem :|
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez Cyfrowy Baron » sobota, 7 stycznia 2012, 21:06

To:
KOD cpp:     UKRYJ  
v[0] = Edit1->Text.c_str()[0];
    v[2] = Edit2->Text.c_str()[0];
    v[4] = Edit3->Text.c_str()[0];
    v[6] = Edit4->Text.c_str()[0];
    v[8] = Edit5->Text.c_str()[0];
    v[10] = Edit6->Text.c_str()[0];

Nie przejdzie, gdyż nie możesz traktować wartości typu String na równie z typem char, a Text jest typu String. Poza tym do zmiennej typu char nie można tak po prostu przypisać wartości po konwersji, tutaj trzeba użyć funkcji sprintf:

KOD cpp:     UKRYJ  
sprintf( v, "%s%s%s%s%s%s%s%s%s%s%s", Edit1->Text.c_str(), "", Edit2->Text.c_str(), "", Edit3->Text.c_str(), "", Edit4->Text.c_str(), "", Edit5->Text.c_str(), "", Edit6->Text.c_str() );

Za ten post autor Cyfrowy Baron otrzymał podziękowanie od:
moderasura
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
    Windows XPFirefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez moderasura » niedziela, 8 stycznia 2012, 01:27

To tak czy siak mi zapisuje na tym
KOD cpp:     UKRYJ  
v[0] = Edit1->Text.c_str()[0];
    v[2] = Edit2->Text.c_str()[0];
    v[4] = Edit3->Text.c_str()[0];
    v[6] = Edit4->Text.c_str()[0];
    v[8] = Edit5->Text.c_str()[0];
    v[10] = Edit6->Text.c_str()[0];
kodzie co tu podałem...Mi chodziło dokładnie o to jak to zrobić by wczytywał i zapisywał zawartość do jednego edita nie używając pozostałych sześciu chciałem zastosować coś takiego
KOD cpp:     UKRYJ  
Edit1->Text = (String) v[0]+v[2]+v[4]+v[6]+v[8]+v[10]  ;
wczytuje plik z taką zawartością M.A.T.R.Y.C.A i wczytuję z powodzeniem

i teraz zapis
KOD cpp:     UKRYJ  
v[0]=v[2]=v[4]=v[6]=v[8]=v[10] = Edit1->Text.c_str()[0];
i tu mam właśnie problem dlatego ze jak zapisuję inny tekst np.Z.M.I.A.N.A.1 to w pliku zawsze zapisuje mi tak Z.Z.Z.Z.Z.Z.Z zawsze pierwszą literę dlaczego tak się dzieje? :shock:
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez polymorphism » niedziela, 8 stycznia 2012, 11:26

A dlaczego miałoby się dziać inaczej? Przecież do sześciu elementów tablicy przypisujesz pierwszy znak.

Zapis:
KOD cpp:     UKRYJ  
v[0] = v[2] = v[4] = v[6] = v[8] = v[10] = znak;

jest równoznaczny z:
KOD cpp:     UKRYJ  
v[10] = znak;
v[8] = v[10];
v[6] = v[8];
v[4] = v[6];
v[2] = v[4];
v[0] = v[2];

Więc skąd to zdziwienie?
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
moderasura
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
    Windows XPFirefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez moderasura » niedziela, 8 stycznia 2012, 13:50

polymorphism napisał(a):Więc skąd to zdziwienie?


teraz już sobie to uświadomiłem cały czas kombinowałem z operatorami a to powinno być tak :shock:


KOD cpp:     UKRYJ  
v[0]= Edit1->Text.c_str()[0];

     v[2]= Edit1->Text.c_str()[1];

     v[4]= Edit1->Text.c_str()[2];

     v[6]= Edit1->Text.c_str()[3];

     v[8]= Edit1->Text.c_str()[4];

     v[10]= Edit1->Text.c_str()[5];
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez Cyfrowy Baron » czwartek, 12 stycznia 2012, 13:04

moderasura napisał(a):To tak czy siak mi zapisuje na tym

KOD cpp:     UKRYJ  
v[0] = Edit1->Text.c_str()[0];
    v[2] = Edit2->Text.c_str()[0];
    v[4] = Edit3->Text.c_str()[0];
    v[6] = Edit4->Text.c_str()[0];
    v[8] = Edit5->Text.c_str()[0];
    v[10] = Edit6->Text.c_str()[0]


Mogę się tylko domyślać, że to wynika z różnic w wersji środowiska, gdyż u mnie ten kod wogóle nie działa, w zmiennej v pojawiają się krzaczki.
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
    Windows XPFirefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez moderasura » czwartek, 12 stycznia 2012, 23:50

Właśnie teraz sprawdziłem to z przykładowego pliku i też pobiera mi jeden znak w postaci krzaczka :o Resztę znaków pobiera normalnie dziwne...

Działający poprawnie kod programu odczytu i zapisu.Pewnie tam trzeba by było jeszcze coś zmienić ale to już inna bajka ;)

KOD cpp:     UKRYJ  
// ---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#include <fstream.h>
#include <stdio.h>
#include "Unit1.h"
// ---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"

char v[13];

TForm1 *Form1;

// ---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) {
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender) {

    String fileName = ExtractFilePath(ParamStr(0)) + "test.BIN";

    fstream infile;
    infile.open(fileName.c_str(), ios::in | ios::binary);

    infile.read((char *)&v, sizeof(v));

    if (sizeof(v) == 0 || infile == NULL) {
        ShowMessage("Plik nie istnieje lub jest pusty");
        return;
    }
    Edit1->Text = (String) v[0] + v[2] + v[4] + v[6] + v[8] + v[10] + v[12];

    infile.close();
}

// ---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender) {

    v[0] = Edit1->Text.c_str()[0];
    v[2] = Edit1->Text.c_str()[1];
    v[4] = Edit1->Text.c_str()[2];
    v[6] = Edit1->Text.c_str()[3];
    v[8] = Edit1->Text.c_str()[4];
    v[10] = Edit1->Text.c_str()[5];
    v[12] = Edit1->Text.c_str()[6];

    String fileName = ExtractFilePath(ParamStr(0)) + "wyjsciowe.DAT";

    fstream outfile;
    outfile.open(fileName.c_str(), ios::out | ios::binary);
    outfile.write((char *)&v, sizeof(v));

    outfile.close();
}

// ---------------------------------------------------------------------------



Przy tworzeniu już ostatecznej wersji programu skorzystam z Twoich wskazówek Baronie ;)
Nie masz wystarczających uprawnień, aby zobaczyć pliki załączone do tego postu.
Ostatnio edytowano piątek, 13 stycznia 2012, 00:43 przez moderasura, łącznie edytowano 3 razy
Avatar użytkownika
moderasura
Homos antropiczny
Homos antropiczny
 
Posty: 57
Dołączył(a): wtorek, 4 stycznia 2011, 20:07
Podziękował : 13
Otrzymał podziękowań: 0
System operacyjny: Windows-7 32 bit
Kompilator: C++ Borland 6
C++Builder 2009
Gadu Gadu: 0
    Windows 7Firefox

Re: Odczyt zapis znaków w komponecie Edit

Nowy postprzez Cyfrowy Baron » piątek, 13 stycznia 2012, 00:38

Używaj funkcji sprintf tak jak to podałem, a będzie dobrze.
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
    Windows XPFirefox


  • 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 15 gości

cron