Wcześniej napisałeś, że tylko Twój program korzysta z tego pliku. Pytam więc jak powstał ten plik, skoro Twój program, który z tego pliku nie korzysta nie utworzył tego pliku. Zadanie jest w sumie banalne, jeżeli to Twój program będzie tworzył plik, gdyż można taki plik utworzyć na kilka sposobów i na kilka sposobów go odczytać, np. z wykorzystaniem struktur:
#include <fstream.h>
struct StructDate
{
float Value[3];
};
void __fastcall TForm1::ButtonSaveClick(TObject *Sender)
{
StructDate Dane;
/* jeżeli EditX->Text nic nie zawiera przerwij */
if(Edit1->Text.IsEmpty() || Edit2->Text.IsEmpty() || Edit3->Text.IsEmpty())
{
ShowMessage("Najpierw wprowadź poprawne dane");
return;
}
Dane.Value[0] = StrToFloat( Edit1->Text );
Dane.Value[1] = StrToFloat( Edit2->Text );
Dane.Value[2] = StrToFloat( Edit3->Text );
/* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
String fileName = ExtractFilePath( ParamStr(0) ) + "Dane.dat";
fstream outfile;
outfile.open( fileName.c_str(), ios::out | ios::binary);
outfile.write((char *)&Dane, sizeof(Dane));
outfile.close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
StructDate Dane;
/* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
String fileName = ExtractFilePath( ParamStr(0) ) + "Dane.dat";
fstream infile;
infile.open(fileName.c_str(), ios::in | ios::binary);
infile.read((char *)&Dane, sizeof(Dane));
if(sizeof(Dane) == 0 || infile == NULL)
{
ShowMessage("Plik nie istnieje lub jest pusty");
return;
}
Edit1->Text = (String)Dane.Value[0];
Edit2->Text = (String)Dane.Value[1];
Edit3->Text = (String)Dane.Value[2];
infile.close();
}
Lepiej jednak użyć w strukturze zmiennej typu char, a nie float, gdyż float ma to do siebie, że jeżeli wypełnisz np. dwa miejsca po przecinku to przy wczytywaniu do tej zmiennej i tak zostanie wprowadzonych 14 miejsc po przecinku, gdyż ta zmienna tyle ich obsługuje.Kod dla C++Builder wersji przed 2009, czyli operującej na AnsiString i char:
#include <fstream.h>
#include <stdio.h>
struct StructDate
{
char Value[3][100];
};
void __fastcall TForm1::ButtonSaveClick(TObject *Sender)
{
StructDate Dane;
/* jeżeli EditX->Text nic nie zawiera przerwij */
if(Edit1->Text.IsEmpty() || Edit2->Text.IsEmpty() || Edit3->Text.IsEmpty())
{
ShowMessage("Najpierw wprowadź poprawne dane");
return;
}
sprintf(Dane.Value[0], "%s", Edit1->Text.c_str());
sprintf(Dane.Value[1], "%s", Edit2->Text.c_str());
sprintf(Dane.Value[2], "%s", Edit3->Text.c_str());
/* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
String fileName = ExtractFilePath( ParamStr(0) ) + "Dane.dat";
fstream outfile;
outfile.open( fileName.c_str(), ios::out | ios::binary);
outfile.write((char *)&Dane, sizeof(Dane));
outfile.close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
StructDate Dane;
/* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
String fileName = ExtractFilePath( ParamStr(0) ) + "Dane.dat";
fstream infile;
infile.open(fileName.c_str(), ios::in | ios::binary);
infile.read((char *)&Dane, sizeof(Dane));
if(sizeof(Dane) == 0 || infile == NULL)
{
ShowMessage("Plik nie istnieje lub jest pusty");
return;
}
Edit1->Text = (String)Dane.Value[0];
Edit2->Text = (String)Dane.Value[1];
Edit3->Text = (String)Dane.Value[2];
infile.close();
}
Dla C++Builder wersji 2009 i nowszej , czyli operującej na UnicodeString i wchar_t zmieni się tylko ten fragment kodu
void __fastcall TForm1::ButtonSaveClick(TObject *Sender)
{
StructDate Dane;
/* jeżeli EditX->Text nic nie zawiera przerwij */
if(Edit1->Text.IsEmpty() || Edit2->Text.IsEmpty() || Edit3->Text.IsEmpty())
{
ShowMessage("Najpierw wprowadź poprawne dane");
return;
}
sprintf(Dane.Value[0], "%s", ((AnsiString)Edit1->Text).c_str());
sprintf(Dane.Value[1], "%s", ((AnsiString)Edit2->Text).c_str());
sprintf(Dane.Value[2], "%s", ((AnsiString)Edit3->Text).c_str());
/* ścieżka dosępu do pliku Dane.dat znajdującego się w tym samym katalogu co program */
String fileName = ExtractFilePath( ParamStr(0) ) + "Dane.dat";
fstream outfile;
outfile.open( fileName.c_str(), ios::out | ios::binary);
outfile.write((char *)&Dane, sizeof(Dane));
outfile.close();
}
Jeszcze ograniczenia dla Edit'ów tak by akceptowały tylko liczby i przecinek:
void __fastcall TForm1::Edit1KeyPress(TObject *Sender, wchar_t &Key) /* zdarzenie OnKeyPress */
{
/* ograniczenie pola Edit do wprowadzania tylko liczb i przecinka */
if(!strchr("0123456789,", Key) && Key != VK_BACK) Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit2KeyPress(TObject *Sender, wchar_t &Key)
{
/* ograniczenie pola Edit do wprowadzania tylko liczb i przecinka */
if(!strchr("0123456789,", Key) && Key != VK_BACK) Key = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Edit3KeyPress(TObject *Sender, wchar_t &Key)
{
/* ograniczenie pola Edit do wprowadzania tylko liczb i przecinka */
if(!strchr("0123456789,", Key) && Key != VK_BACK) Key = 0;
}
Jak widzisz nie problem zapisać i odczytać dane do/z pliku o ile znasz strukturę tych danych w pliku. By wiedzieć jak odczytać ten Twój plik, trzeba wiedzieć jaka jest jego struktura, ale to już masz, gdyż pobierasz konkretne bajty, więc odwróć to i zapisz te bajty pod tym samym adresem.