2016-05-08 2 views
-3

Я пытался использовать указатель void как массив Struct, чтобы сохранить несколько объектов struct на диске. Я хочу записать записи на диск с помощью указателя void (подумайте, что кластер состоит из записей) ,Void pointer as struct array в C

void addRecordToDataPage(City record) 
{ 
void* data = malloc(sizeof(City)*RECORD_COUNT); 
FILE* fp; 
fp=fopen("sampledata2.dat", "rb"); 
City pageofCity [RECORD_COUNT]; //City is my Struct. 
if(!fp) //if it is first access, put the record to pageofCity[0].. 
    { 
    pageofCity[0]=record; 
    data=pageofCity; 
    writeDataPageToDisk(data); ..and call the write func. 
    return; 
    } 

fread(&data, sizeof(City)*RECORD_COUNT, 1, fp); 
int i=0; 
while((City *)data) 
    { 
    pageofCity[i] = ((City *)data)[i]; 
    i++; 
    } 
pageofCity[i]=record; 


} 
//and this is my writer function. 
void writeDataPageToDisk(void* dataPage) 
{ 
FILE* fp; 
fp=fopen("sampledata2.dat", "a"); 
if(!fp) 
    { 
    fp=fopen("sampledata2.dat", "wb"); 
    writeDataPageToDisk(dataPage); 
    } 
fwrite(dataPage, sizeof(City)*RECORD_COUNT,1,fp); 
fclose(fp); 
} 

в строке pageofCity[i] = ((City *)data)[i]; У меня ошибка памяти. Это мой первый вопрос на этом сайте, пожалуйста, прости меня за мои ошибки :).

+0

Вы должны были сначала прочитать [спросить]. И предоставить [mcve]. Не совсем понятно, что вы на самом деле хотите. Указатели не должны храниться в файле, так как они ** очень ** вероятно недействительны при следующем запуске. – Olaf

+0

И формат и отступ. Он не читается. – Olaf

+2

С этим кодом возникают стилистические и другие проблемы, но при быстром взгляде ваша проблема выглядит так: 'while ((City *) data)'. 'data' никогда не изменяется, поэтому это кажется бесконечным циклом. –

ответ

0

С кодом возникает несколько проблем.

Наиболее вероятная причина вашей ошибки выглядит следующим образом:

while((City *)data) 

Значение data никогда не меняется, и вы постоянно читаете память байте вперед каждый раз в цикле.

if (!fp) 
{ 
    int recordsRead = fread(&data, sizeof(City), READ_COUNT, fp); 
    int i=0; 
    while(i < recordsRead) 
    { 
    } 
} 
pageOfCity[recordsRead] = record; 

Также, поскольку вы добавляете в свой массив один дополнительный элемент, вам нужно будет указать дополнительное пространство для этой записи.

City pageofCity [RECORD_COUNT + 1]; //City is my Struct.