[c++] problem z odczytem i zapisem do plikow

0

Mam na zaliczenie napisac pewien program który korzysta z zapisywania i odczytywania z pliku. Mam strukturę SequenceKey, która zawiera wszystkie potrzebne dla mnie parametry i jak chce zapisać ją do pliku

fwrite((void *)&bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);

i potem coś w niej zmieniam, następnie wczytuje z pliku fread((void *)&bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);

 i wypisuje na ekranie wszystkie pola struktury to wyswietla sie zawartosc struktury ktora zostala zmianiona przez program po zapisie do pliku.

Czyli wnioskuję, że mam jakiś problem albo z zapisywaniem, albo z odczytywam, albo z jednym i drugim. Proszę o pomoc

EDIT
chodzi mi o to, że mam wczytywać/zapisywać do pliku blokowo i chcę aby każdy rekord zawieral double, double, int. Ale chyba robię coś nie tak.
0

musisz pokazać więcej kodu...

0
#define PAGE_SIZE 1

using namespace std;

//struktura pliku z kluczami
struct SequenceKey
{
    double U;
    double I;
    int page;
};

class Page
{
private:
    FILE *key;
    SequenceKey *bufferKey;
    int actuallPage;

    void OpenFile(const char* mode, int tmp = 0) {
        if(tmp == 0) {
            key = fopen("key.bin", mode);
        } else {
            tmpKey = fopen("tmpKey.bin", mode);
        }
    }

    void CloseFile(int tmp = 0) {
        if(tmp == 0) {
            fclose(key);
        } else {
            fclose(tmpKey);
        }
    }

    void ReadFile(FILE* &fp, int mode, int tmp = 0) {
        fseek(fp, actuallPage*5, 0);
        fread((void *)&bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
    }

    void WriteFile(FILE* &fp, int mode, int tmp = 0) {
        fseek(fp, actuallPage*5, 0);
        fwrite((void *)&bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
    }

public:
    void ShowBufferKey() {
        for(int i=0; i<PAGE_SIZE; i++)
            cout << "U: " << bufferKey[i].U << ", I: " << bufferKey[i].I << endl;
    }

    Page() {
        bufferKey = new SequenceKey[PAGE_SIZE];
        for(int i=0;i<PAGE_SIZE;i++) {
            bufferKey[i].U = -1.0;
            bufferKey[i].I = 1.0;
            bufferKey[i].page = 0;
        }
        actuallPage = 0;

        OpenFile("w");
        CloseFile();
        OpenFile("r+b");
        WriteFile(key, 0);
        bufferKey[0].U=2;
        bufferKey[0].I=2;
        ReadFile(key, 0);
    }

    ~Page() {
        CloseFile();
        delete [] bufferKey;
    }
}

int main() {
    Page file;
    double U, I;

    file.ShowBufferKey();
}

jeśli dobrze by zapisało do pliku i odczytalo z pliku to powinno U i I być równe 1 a nie 2 a wypisuje mi 2

EDIT
Przed chwilą kumpel pomógł, i przy fread i fwrite, kazał usunąć znaki &, pomogło. Nie jest to jednak koniec moich problemów, które pojawiły się nagle przy pisaniu. Proszę więc nie blokować tematu a będę umieszczał tu dalsze pytania dotyczące tego zadania.

// bez obaw, b.rzadko blokujemy tematy - R

0

OpenFile("w");
CloseFile();
OpenFile("r+b");
WriteFile(key, 0);
bufferKey[0].U=2;
bufferKey[0].I=2;
ReadFile(key, 0);
no dramat, człowieku zastanów się co chcesz zrobić bo kolejność jest koszmarna

W ogóle ten kod nie ma prawa się skompilować. Namieszałeś z tym "tmp", nie potrzebne jest ono tam w ogóle.

0
adf88 napisał(a)

OpenFile("w");
CloseFile();
OpenFile("r+b");
WriteFile(key, 0);
bufferKey[0].U=2;
bufferKey[0].I=2;
ReadFile(key, 0);
no dramat, człowieku zastanów się co chcesz zrobić bo kolejność jest koszmarna

W ogóle ten kod nie ma prawa się skompilować. Namieszałeś z tym "tmp", nie potrzebne jest ono tam w ogóle.

możesz dokładnie powiedzieć o co ci chodzi ?
zmienna tmp potrzebna mi jest w dalszej czesci programu, a jesli jej nie podam to ma przyjąć wartość 0.

Teraz mam problem z odpowiednim przesuwaniem wnętrza pliku tak aby zapisywac klucze, plik główny i overflow w pliku głównym.
Nie wiem jak funkcja fseek przesuwa wskaznik pliku. Wiem że jest offset, ale nie wiem czy jeśli offset=1 to przesuwa on o 8 bitów, 32 bity czy o ile do przodu jesli plik mam otworzyny z parametrem r+b ?

0
  • otwierasz plik
  • zamykasz, po co w ogóle otwierałeś ?
  • znowu otwierasz [???]
0
adf88 napisał(a)
  • otwierasz plik
  • zamykasz, po co w ogóle otwierałeś ?
  • znowu otwierasz [???]

parametr "w" tworzy mi plik jesli nie istnieje i kasuje jego zawartość.
a pozniej otwieram go z parametrem "r+b" abym mógł sobie odczytywać i zapisywać binarnie do pliku i za pomocą funkcji fseek wędrować sobie po pliku

Dla uszczegółowienia pisze sortowanie metodą indeksowo-sekwencyjną. Polega to na tym, że wartości mam w cześci głównej i w części "overflow". Funkcja reorganizacji wrzuca wszystkie wartości z overflow do cześci głównej i ustawia je po kolei. W czasie reorganizacji tworzy mi się dodatkowo plik i po procesie reorganizacji chciałem zmienić wskaznik aby otworzyl plik posortowany, ale coś nie chce mi zmieniać wskaźnika, poniżej kod:

#include <iostream>

#define PAGE_SIZE 10

using namespace std;

//struktura pliku z kluczami
struct SequenceKey
{
    double U;
    double I;
    int page;
};

//struktura pliku z główną zawartością
struct SequenceFile
{
    double U;
    double I;
    unsigned int pointer;
    unsigned int exist;
    unsigned int repeat;
};

class Page
{
private:
    FILE *keyPrime, *filePrime;
    SequenceKey *bufferKey;
    SequenceFile *bufferFile;
    SequenceFile *bufferOverflow;
    int filebool;
    int numberOfPages;
    int numberOfKeys;
    int numberOfKeysInOverflow;
    int actuallPage;
    int actuallPosition;
    int actuallPositionInOverflow;

    //dane do reorganizacji - POCZATEK
    FILE *keyTmp, *fileTmp;
    SequenceKey *tmpBufferKey;
    SequenceFile *tmpBufferFile;
    SequenceFile *tmpBufferOverflow;
    int tmpNumberOfPages;
    int tmpActuallPage;
    int tmpActuallPagePosition;
    int tmpActuallPosition;
    //dane do reorganizacji - KONIEC

    void OpenFile(const char* mode, int tmp = 0) {
        if(tmp == 0) {
            if(filebool==0) {
                keyPrime = fopen("key.bin", mode);
                filePrime = fopen("file.bin", mode);
            } else {
                keyTmp = fopen("key.bin", mode);
                fileTmp = fopen("file.bin", mode);
            }
        } else if(tmp == 1) {
            if(filebool==0) {
                keyTmp = fopen("tmpKey.bin", mode);
                fileTmp = fopen("tmpFile.bin", mode);
            } else {
                keyPrime = fopen("tmpKey.bin", mode);
                filePrime = fopen("tmpFile.bin", mode);
            }
        }
    }

    void CloseFile(int tmp = 0) {
        if(tmp == 0) {
            if(filebool==0) {
                fclose(keyPrime);
                fclose(filePrime);
            } else {
                fclose(keyTmp);
                fclose(fileTmp);
            }
        } else if(tmp == 1) {
            if(filebool==0) {
                fclose(keyTmp);
                fclose(fileTmp);
            } else {
                fclose(keyPrime);
                fclose(filePrime);
            }
        }
    }

    void ReadFile(int mode, int tmp = 0) {
        FILE* fp;
        if (tmp == 0) {
            if(mode==0) {
                fp = keyPrime;
                fseek(fp, actuallPage*sizeof(SequenceKey)*PAGE_SIZE, 0);
                fread((void *)bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
            } else if(mode==1) {
                fp = filePrime;
                fseek(fp, actuallPage*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fread((void *)bufferFile, sizeof(SequenceFile), PAGE_SIZE, fp);
            } else {
                fp = filePrime;
                fseek(fp, numberOfPages*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fread((void *)bufferOverflow, sizeof(SequenceFile), PAGE_SIZE, fp);
            }
         } else {
            if(mode==0) {
                fp = keyTmp;
                fseek(fp, tmpActuallPage*sizeof(SequenceKey)*PAGE_SIZE, 0);
                fread((void *)tmpBufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
            } else if(mode==1) {
                fp = fileTmp;
                fseek(fp, tmpActuallPage*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fread((void *)tmpBufferFile, sizeof(SequenceFile), PAGE_SIZE, fp);
            } else {
                fp = fileTmp;
                fseek(fp, tmpNumberOfPages*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fread((void *)tmpBufferOverflow, sizeof(SequenceFile), PAGE_SIZE, fp);
            }
         }
    }

    void WriteFile(int mode, int tmp = 0) {
        FILE *fp;
        if(tmp==0)
            if(mode==0) {
                fp = keyPrime;
                fseek(fp, actuallPage*sizeof(SequenceKey)*PAGE_SIZE, 0);
                fwrite((void *)bufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
            } else if(mode==1) {
                fp = filePrime;
                fseek(fp, actuallPage*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fwrite((void *)bufferFile, sizeof(SequenceFile), PAGE_SIZE, fp);
            } else {
                fp = filePrime;
                fseek(fp, numberOfPages*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fwrite((void *)bufferOverflow, sizeof(SequenceFile), PAGE_SIZE, fp);
            }
        else
            if(mode==0) {
                fp = keyTmp;
                fseek(fp, actuallPage*sizeof(SequenceKey)*PAGE_SIZE, 0);
                fwrite((void *)tmpBufferKey, sizeof(SequenceKey), PAGE_SIZE, fp);
            } else if(mode==1) {
                fp = fileTmp;
                fseek(fp, actuallPage*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fwrite((void *)tmpBufferFile, sizeof(SequenceFile), PAGE_SIZE, fp);
            } else {
                fp = fileTmp;
                fseek(fp, numberOfPages*sizeof(SequenceFile)*PAGE_SIZE, 0);
                fwrite((void *)tmpBufferOverflow, sizeof(SequenceFile), PAGE_SIZE, fp);
            }
    }

    void Reorganize() {
        ...
        //dodac otwarcie plikow
        OpenFile("w", 1);
        CloseFile(1);
        OpenFile("r+b", 1);
        //KOD REORGANIZACJI
        //zamkniecie plikow
        CloseFile(1);

        CloseFile();
        if(filebool==0)
            filebool=1;
        else
            filebool=0;
        OpenFile("r+b");
    }
}

I teraz tak, jak uruchamiam funkcję reorganizacji to otwieram plik tymczasowy i zapisuje w nim posortowane rekordy, potem zamykam go. Zmienna filebool mówi mi, czy za plik główny mam wziaźć plik ktory powstal przed chwila w procesie reorganizacji. Ale jak otwieram plik to otwiera mi tak jakby plik z niposortowanymi wartościami, chyba. Bo jak zczytuje je do bufora to są nieposortowane rekordy.

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