C 从文件中的数据获取结构变量

C 从文件中的数据获取结构变量,c,file,C,File,我试图从文件中提取有关结构变量的信息 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 nentr

我试图从文件中提取有关结构变量的信息

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;

基本上,我希望能够提取有关
rootdir\u块的信息,这是一种结构。不知道怎么做。谢谢。

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


/*Variabel来存储我们从文件中读取的数据*/
SIFS\u卷头数据;
/*我们以只读方式打开二进制文件*/
文件*fp=fopen(卷名,“rb”);
如果(fp!=NULL)
{
fseek(fp,sizeof header,SEEK_SET);
fread(表头数据),sizeof(表头数据),1,fp;
/*
验证读取是否成功,以及我们是否读取了正确的
数据量与我们预期的一样。
*/
}
在这里,我们假设您只保存了一个结构,而在文件中只保存了一个结构

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

咨询一些人。还要注意,如果您正在读取或写入二进制数据,则必须以二进制模式打开文件(将“b”添加到
fopen
的openmode标志中)。
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;
}

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

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