W jaki sposob można zapisać zawartość StringGrida do pliku txt /znajdującego sie w katalogu bieżącym/ a potem odczytać ?
Zapis:
FILE *pF = NULL;
int nRows = StringGrid1->RowCount, nCols = StringGrid1->ColCount;
pF = fopen("save.txt", "wt+");
if(pF != NULL)
{
fprintf(pF, "%d %d ", nRows, nCols);
for(int i = 0; i < nRows; i++)
for(int j = 0; j < nCols; j++)
fprintf(pF, "%s\n", StringGrid1->Cells[i][j].c_str());
fclose(pF);
}
else
Application->MessageBox("Błąd podczas otwierania pliku", "Błąd", MB_OK | MB_ICONERROR);
Odczyt:
FILE *pF = NULL;
int nRows = StringGrid1->RowCount, nCols = StringGrid1->ColCount;
pF = fopen("save.txt", "rt+");
if(pF != NULL)
{
fscanf(pF, "%d %d", &nRows, &nCols);
char tmp[255];
for(int i = 0; i < nRows; i++)
for(int j = 0; j < nCols; j++)
{
fscanf(pF, "%s", tmp);
StringGrid1->Cells[i][j] = tmp;
}
fclose(pF);
}
else
Application->MessageBox("Błąd podczas otwierania pliku", "Błąd", MB_OK | MB_ICONERROR);
Metoda ta działa dobrze dopóki wszystkie pola StringGrida są wypełnione. Jeżeli jednak któreś jest puste to przy odczycie te które powinny być puste są zapełnione ostatnim odczytanym stringiem :-(. Może szanowni forumowicze coś poradzą :-)
Dzieki wielkie:)
Znalazłem jeszcze cos takiego do odczytuz txt tylko w Delphi-tylko nie umiem tego zapisac w builderze(ciągle jest problem z konwersja String z AnsiString):
......
while not Eof(Plik) do
begin
StringGrid1.RowCount := StringGrid1.RowCount + 1;
Readln(Plik, t);
StringGrid1.Rows[i].CommaText := t;
Inc(i);
end;
CloseFile(Plik);
.....
jeśli mogłby to Ktoś zapisac w kodzie buildera byłbym ogromnie wdzięczny:)
Pozdrawiam
Zapis:
FILE *pF = NULL;
pF = fopen("save.txt", "wt+");
if(pF != NULL)
{
for(UINT i = 0; i < StringGrid1->RowCount; i++)
fprintf(pF, "%s\n", StringGrid1->Rows[i]->CommaText.c_str());
fclose(pF);
}
else
Application->MessageBox("Błąd podczas tworzenia pliku", "Błąd", MB_OK | MB_ICONERROR);
Odczyt:
FILE *pF = NULL;
pF = fopen("save.txt", "rt+");
if(pF != NULL)
{
UINT i = 0, n = 1000;
char *tmp = (char*)malloc(n);
while(!feof(pF))
{
fscanf(pF, "%s\n", tmp);
StringGrid1->Rows[i]->CommaText = tmp;
i++;
}
free(tmp);
}
else
Application->MessageBox("Błąd podczas odczytu z pliku", "Błąd", MB_OK | MB_ICONERROR);
fclose(pF);
Rozmiar tmp (czyli wartość n) powinien być równy ilość kolumn * max długość pola + wszystkie przecinki w danej lini. Nie napiszę kodu żeby nie było zbyt łatwo :-)
Pozdrawiam!
Aha - zamiast
fscanf(pF, "%s\n", tmp);
to
fgets(tmp, n, pF);