получение структурной переменной из данных в файле - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь извлечь из файла информацию о структурной переменной.

global.h

//  DEFINITION OF EACH DIRECTORY BLOCK - MUST FIT INSIDE A SINGLE BLOCK
typedef struct {
    char        name[SIFS_MAX_NAME_LENGTH];
    time_t      modtime;    // time last modified <- time()

    uint32_t        nentries;
    struct {
    SIFS_BLOCKID    blockID;    // of the entry's subdirectory or file
    uint32_t    fileindex;  // into a SIFS_FILEBLOCK's filenames[]
    } entries[SIFS_MAX_ENTRIES];
} SIFS_DIRBLOCK;

file1.c

int SIFS_mkvolume(const char *volumename, size_t blocksize, uint32_t nblocks)
{

    FILE *vol   = fopen(volumename, "w");

//  DEFINE AND INITIALISE VARIABLES FOR header, bitmap, and blocks
    SIFS_VOLUME_HEADER  header = {
        .blocksize  = blocksize,
        .nblocks    = nblocks,
    };

    SIFS_BIT      bitmap[nblocks];

    bitmap[SIFS_ROOTDIR_BLOCKID] = SIFS_DIR;    // the root directory
    for(int b=1 ; b<nblocks ; ++b) {
        bitmap[b]   = SIFS_UNUSED;
    }

    char        oneblock[blocksize];

    SIFS_DIRBLOCK   rootdir_block;
    memset(&rootdir_block, 0, sizeof rootdir_block);    // cleared to all zeroes

    rootdir_block.name[0]       = '\0';
    rootdir_block.modtime   = time(NULL);
    rootdir_block.nentries  = 0;
    memset(oneblock, 0, sizeof oneblock);        // cleared to all zeroes
    memcpy(oneblock, &rootdir_block, sizeof rootdir_block);

//  WRITE ALL OF THE INITIALISED SECTIONS TO THE VOLUME
    fwrite(&header, sizeof header, 1, vol);
    fwrite(bitmap,  sizeof bitmap, 1, vol);

    fwrite(oneblock, sizeof oneblock, 1, vol);  // write rootdir
    memset(oneblock, 0, sizeof oneblock);   // reset to all zeroes
    for(int b=1 ; b<nblocks ; ++b) {
        fwrite(oneblock, sizeof oneblock, 1, vol);
    }

//  FINISHED, CLOSE THE VOLUME
    fclose(vol);

//  AND RETURN INDICATING SUCCESS
    return 0;
}

Если я хочу получить доступ к информации о будущем, которая была rootdir_block, как мне это сделать?

Я попытался это сделать:

file2.c

FILE *fp = fopen(volumename, "r+");

    if(fp != NULL){
        fseek(fp,sizeof header,SEEK_SET);
        fread(//not sure what to do here);
    }

В сущности, я хочу иметь возможность извлечь информацию о rootdir_block, который является структурой. Не уверен, как это сделать. Спасибо.

1 Ответ

0 голосов
/ 11 октября 2019

Вы бы сделали это так, как если бы вы читали двоичный файл . поэтому в той части, где вы читаете файл, вы должны сделать следующее:


/* Variabel to store the data we read from the file */
SIFS_VOLUME_HEADER  header_data;


/* We open the binary file for read only */
FILE *fp = fopen(volumename, "rb");

if(fp != NULL)
{

    fseek(fp,sizeof header,SEEK_SET);
    fread(header_data, sizeof(header_data), 1, fp);
    /*
      Verify if the read was successful and we read the correct
      amount of data as we expected.
    */
}

здесь мы предполагаем, что вы сохранили только 1 структуру и больше ничего в файле.

Предупреждение: хранение структуры в файле таким способом может быть не переносимым, поэтому, если вы решите сохранить свою структуру на одной платформе и прочитать ее на другой платформе, она может не работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...