[Borland C++] Zapis histogramu do pliku tekstowego

0

Witam

Piszę program z GUI pod Borlandem C++ 6.0 i na podstawie algorytmu tworzę sobie histogram i wyświetlam w osobnej formie. Chciałbym jednak obliczenia zapisać do pliku tekstowego.

Histogram tworzę wg takiego algorytmu:
[/code]
int x, y, tmp_x, i;
BYTE* LinePtr;
int kolory[256];

if (Form2 -> Image1 -> Picture -> Bitmap -> PixelFormat == pf24bit)
{
    i = 3;
}
else
{
    i = 1;
}

// obliczanie histogramu
for (x = 0; x < 256; x++)
    kolory[x] = 0;

    for (y = 0; y < Form2 -> Image1 -> Picture -> Bitmap -> Height; y++)
    {
            LinePtr = (BYTE*) Form2 -> Image1 -> Picture -> Bitmap -> ScanLine[y];
            for (x = 0; x < i * Form2 -> Image1 -> Picture -> Bitmap -> Width; x = x + i)
            {
                    if (Form2 -> Image1 -> Picture -> Bitmap -> PixelFormat == pf24bit)
                    {
                            tmp_x = (LinePtr[x] + LinePtr[x] + LinePtr[x]) / 3;
                    }
                    else
                    {
                            tmp_x = LinePtr[x];
                    }

                kolory[tmp_x]++;
            }
    }

int srednia = (Form2 -> Image1 -> Width * Form2 -> Image1 -> Height) >> 8;

// rysowanie histogramu
Form3 -> Image2 -> Canvas -> Pen -> Style = psSolid;
Form3 -> Image2 -> Canvas -> Pen -> Color =  clBlack;
Form3 -> Image2 -> Picture -> Bitmap -> PixelFormat = Form2 -> Image1 -> Picture -> Bitmap -> PixelFormat;

for (x = 0; x < 256; x++)
{
    Form3 -> Image2 -> Canvas -> MoveTo(x, Form3 -> Image2 ->Height);
    Form3 -> Image2 -> Canvas -> Pen -> Color = (TColor) x << 16 | x << 8 | x;
    Form3 -> Image2 -> Canvas -> LineTo(x, Form3 -> Image2 -> Height - 10);
    Form3 -> Image2 -> Canvas -> Pen -> Color = clBlack;
    Form3 -> Image2 -> Canvas -> LineTo(x, Form3 -> Image2 -> Height - 10 - ((100 * kolory[x]) / (srednia * 5)));
}

Form3 -> Image2 -> Canvas -> Pen -> Color = clWhite;
Form3 -> Image2 -> Canvas -> MoveTo(0, Form3 -> Image2 -> Height - 10);
Form3 -> Image2 -> Canvas -> LineTo(256, Form3 -> Image2 -> Height - 10);

Form3->Show();

[/code]

Taki algorytm znalazłem w sieci. W jaki sposób zapisać to do pliku z wykorzystaniem kontrolki "SaveDialog", ewentualnie jak wynik obliczeń histogramu zapisać do kontrolki "Memo", skąd bym już zapisać do pliku tekstowego ?

0

if(SaveDialog1->Execute())
{
SaveDialog1->FileName // nazwa pliku
}
zapisujesz tak jak sobie chcesz.

0

W jaki sposób zapisać to do pliku z wykorzystaniem kontrolki "SaveDialog"
SaveDialog nie zapisuje niczego, a jedynie pozwala wybrać nazwę pliku i ją zwraca.

0

Sposób zapisu za pomocą kontrolki SaveDialog jest mi znany. Nie wiem w jaki sposób jej użyć (co wstawić do środka), żeby zapisać wyniki obliczenia histogramu (wartości obliczonych pikseli) do pliku tekstowego.

0

ofstream fs(SaveDialog1->FileName.c_str());
fs<<"ala ma kota "<<34<<' '<<15;
fs.close();

0

Umieściłem ten fragment w sekcji zapisu, na próbę podając tylko zwykły tekst:

[code]
void __fastcall TForm3::Zapiszdoplikutekstowego1Click(TObject *Sender)
{
if (SaveDialog1 -> Execute())
{
ofstream fs(SaveDialog1->FileName.c_str());
fs << "BlaBla" ;
fs.close;
}
}
[code]
Załączyłem plik nagłówkowy #include <fstream> i dostaje komunikat "Undefined symbol 'ofstream'. Jaki plik trzeba do tego dołączyć?

0
 using namespace std;
0

Faktycznie teraz działa. Ładnie się utworzył plik tekstowy i wstawiło mi mój napis. Tu jednak mam jeszcze jedno pytanie. Aplikację którą robię ma zrobioną na kilku formach. Algorytm tworzenia histogramu podpiąłem do przycisku w formie1, natomiast histogram i opcję zapisu mam w formie 3. Nie do końca rozumiem działanie algorytmu obliczania histogramu, ale jeżeli się nie mylę to wartość obliczonych pikseli została załadowana do tablicy kolory za pomocą trzech pętli for, tak jak jest w komentarzu. Podpowiedzcie mi proszę jak odwołać się tej tablicy, żeby z niej odczytało mi dane do pliku. Jak np. chciałem, żeby użycie przycisku w pierwszej formie robiło coś w formie 2 to wpisywałem:
[code]
Form2 -> Image1 -> Picture -> Bitmap -> PixelFormat == pf24bit
[/code]
Oczywiście dołączając w odpowiednich formach inne formy
Jak odwołać się do tych obliczeń i wyrzucić je do pliku?

0

Musisz tą tablicę przenieść ze zmiennych lokalnych do składowej klasy.
Wtedy się odwołasz dokładnie tak jak z tym Image1.

0

Wpisałem w ten sposób:
[code]
fs << Glowne -> bHistogram -> kolory;
[/code]

Niestety dostaje komunikat 'kolory' is not a member of 'TButton'. Deklarację tablicy int kolory[256] przeniosłem poza lokalny zasięg przycisku histogramu (bHistogram)
[code]
void __fastcall TGlowne::bHistogramClick(TObject *Sender)
{
}
[/code]
bezpośrednio po #includach i pod TGlowne *Glowne;
Jak na próbę dodałem sobie kontrolkę SaveDialog i Button-a w pierwszej formie (Glowne) to dostaje ten sam błąd.
Gdzie popełniam błąd?

0

Wiem o tym. Jestem na etapie studiowania Symfonii, ale do obiektówki jeszcze nie doszedłem, nie mniej projekt muszę zrobić, dlatego szukam pomocy gdzie mogę. To jest tylko jeden z elementów projektu. Powoli je składam w całość, ale jak słusznie zauważyłeś wykładam się na podstawach i daleka droga jeszcze mnie czeka.

0

Dzięki za propozycję, ale nie nauczę się pływać kupując kartę pływacką, tak samo z programowaniem. Może kiedyś się skuszę na kupienia gotowca, ale nie z powodu zapisu do pliku tekstowego.

Dużo mi pomogłeś. Dziękuję.

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