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.