zapis StringGrida do pliku txt?(builder)

0

W jaki sposob można zapisać zawartość StringGrida do pliku txt /znajdującego sie w katalogu bieżącym/ a potem odczytać ?

0

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ą :-)

0

Dzieki wielkie:)

0

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

0

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!

0

Aha - zamiast

fscanf(pF, "%s\n", tmp);

to

fgets(tmp, n, pF);

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