首页 > 解决方案 > 从文件中的数据中获取结构变量

问题描述

我正在尝试从文件中提取有关结构变量的信息。

全局.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;

文件1.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我该怎么做?

我试过这个:

文件2.c

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

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

基本上,我希望能够提取关于rootdir_block哪个是结构的信息。不知道该怎么做。谢谢。

标签: cfile

解决方案


您会像在读取二进制文件一样执行此操作。因此,在您正在读取文件的部分,您将执行以下操作


/* 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 个结构,文件中没有其他内容。

警告:以这种方式将结构存储在文件中可能无法移植,因此如果您决定将结构存储在一个平台上并在其他平台上读取它,它可能无法正常工作。


推荐阅读