C-读取文件中的结构

C-读取文件中的结构,c,struct,fwrite,lseek,C,Struct,Fwrite,Lseek,您好,我想读取我用fwrite在文件中编写的结构中的一些信息,但有一个问题,我无法提取这些信息。我有两个文件 tttfs.h: #include <stdlib.h> #include <stdio.h> #include <stdint.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h>

您好,我想读取我用
fwrite
在文件中编写的结构中的一些信息,但有一个问题,我无法提取这些信息。我有两个文件

tttfs.h:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

typedef struct _disk disk;
typedef struct _block block;

struct _block{
    uint8_t *unBlock;
};

struct _disk{
    int id;
    block *diskBlock;
};

不是我所期望的,我在没有阅读的情况下尝试了,我得到了同样的结果。所以我的程序没有从磁盘写入信息。或者在磁盘中写入块时出现问题?

我不能确定您到底想要什么,但这应该可以

#define BLOCK_BUFF_SIZE (1024*sizeof(block))


int tttfs_create(int size, char *name);
int tttfs_load(char *fname, disk *pdisk)

void inttolitend(uint32_t x, uint8_t* lit_int);

int tttfs_load(char *fname, disk *pdisk){
    int fd;
    unsigned int n;
    int i;
    fd = open("disk.tfs",_O_RDONLY);
    if(fd==-1){
        perror("tttfs_load.open");
        return -1;
    }
    n=lseek (fd,0,SEEK_END);
    lseek(fd,0,SEEK_SET);

    if(n==(unsigned int)-1){
        close(fd);
        return -1;
    }

    if(n){
        n/=(BLOCK_BUFF_SIZE);

        pdisk->diskBlock=malloc(n*sizeof(block));

        for(i=0;i<n;i++){
            pdisk->diskBlock[i].unBlock=malloc(BLOCK_BUFF_SIZE);
            read(fd,pdisk->diskBlock[i].unBlock,BLOCK_BUFF_SIZE);
        }

    }
    close(fd);
    return n;
}
int main(){


    unsigned int n;
    disk d;
    int i;

    tttfs_create(7, "disk.tfs");
    n=tttfs_load("disk.tfs",&d);
    if(!n || n==(-1)) return -1;



    for(i=0; i<4; i++){
        printf("%d\n", (uint8_t)(d.diskBlock->unBlock[i]));//print my result.
    }
}

int tttfs_create(int size, char *name){
    FILE    *f = NULL;
    disk    d;
    int     i;

    if (!(f = fopen(name, "wb"))) {
        perror("tttfs_create:open()");
        return 0;
    }


    d.diskBlock = malloc(sizeof(block) * size);
    d.id = 1;

    for(i = 0; i<size; i++){
       d.diskBlock[i].unBlock = malloc(BLOCK_BUFF_SIZE);
    }
    inttolitend(size,  (uint8_t*)(d.diskBlock->unBlock));

    for(i=0;i<size;i++){
        fwrite(d.diskBlock[i].unBlock ,BLOCK_BUFF_SIZE,1,f); 
    }



    return 1;
}

void inttolitend(uint32_t x, uint8_t* lit_int){

    lit_int[3] = ((x<<24) & 0xff);
    lit_int[2] = ((x<<16) & 0xff);
    lit_int[1] = ((x<<8)  & 0xff);
    lit_int[0] = ((x<<0)  & 0xff);

}
#定义块_BUFF_大小(1024*sizeof(块))
int tttfs_create(int size,char*name);
int tttfs_加载(字符*fname,磁盘*pdisk)
无效inttolitend(uint32\u t x,uint8\u t*lit\u int);
int tttfs_加载(字符*fname,磁盘*pdisk){
int-fd;
无符号整数n;
int i;
fd=打开(“disk.tfs”,仅限rdu);
如果(fd==-1){
perror(“tttfs_load.open”);
返回-1;
}
n=lseek(fd,0,SEEK_END);
lseek(fd,0,SEEK_集);
if(n==(无符号整数)-1){
关闭(fd);
返回-1;
}
如果(n){
n/=(块大小);
pdisk->diskBlock=malloc(n*sizeof(block));
对于(i=0;idiskBlock[i]。取消阻塞=malloc(块大小);
读取(fd,pdisk->diskBlock[i]。解除阻塞,块大小);
}
}
关闭(fd);
返回n;
}
int main(){
无符号整数n;
磁盘d;
int i;
tttfs_create(7,“disk.tfs”);
n=tttfs_加载(“disk.tfs”和&d);
如果(!n | n==(-1))返回-1;
对于(i=0;iunBlock[i]);//打印我的结果。
}
}
int tttfs_创建(int大小,字符*名称){
文件*f=NULL;
磁盘d;
int i;
如果(!(f=fopen(名称,“wb”)){
perror(“tttfs_create:open()”;
返回0;
}
d、 diskBlock=malloc(sizeof(block)*大小);
d、 id=1;
对于(i=0;iunBlock));

对于(i=0;它是
fwrite(&d->diskBlock[i],sizeof(block),1,f);
仍然错误。@iharob我必须更改什么?
sizeof
?也添加块的大小,
sizeof(block)+1024
我想。请小心仔细想想,我记得你上一个问题,但我不是100%肯定。@iharob这是一个很长的故事,但我的大学搞砸了……他们没有教我们C的基础知识,也没有用高级C来处理系统问题……所以我真的对malloc和所有这些东西感到迷茫。@iharob我改变了它,测试了a收获。总是一样的问题。。。
0
8
16
24
#define BLOCK_BUFF_SIZE (1024*sizeof(block))


int tttfs_create(int size, char *name);
int tttfs_load(char *fname, disk *pdisk)

void inttolitend(uint32_t x, uint8_t* lit_int);

int tttfs_load(char *fname, disk *pdisk){
    int fd;
    unsigned int n;
    int i;
    fd = open("disk.tfs",_O_RDONLY);
    if(fd==-1){
        perror("tttfs_load.open");
        return -1;
    }
    n=lseek (fd,0,SEEK_END);
    lseek(fd,0,SEEK_SET);

    if(n==(unsigned int)-1){
        close(fd);
        return -1;
    }

    if(n){
        n/=(BLOCK_BUFF_SIZE);

        pdisk->diskBlock=malloc(n*sizeof(block));

        for(i=0;i<n;i++){
            pdisk->diskBlock[i].unBlock=malloc(BLOCK_BUFF_SIZE);
            read(fd,pdisk->diskBlock[i].unBlock,BLOCK_BUFF_SIZE);
        }

    }
    close(fd);
    return n;
}
int main(){


    unsigned int n;
    disk d;
    int i;

    tttfs_create(7, "disk.tfs");
    n=tttfs_load("disk.tfs",&d);
    if(!n || n==(-1)) return -1;



    for(i=0; i<4; i++){
        printf("%d\n", (uint8_t)(d.diskBlock->unBlock[i]));//print my result.
    }
}

int tttfs_create(int size, char *name){
    FILE    *f = NULL;
    disk    d;
    int     i;

    if (!(f = fopen(name, "wb"))) {
        perror("tttfs_create:open()");
        return 0;
    }


    d.diskBlock = malloc(sizeof(block) * size);
    d.id = 1;

    for(i = 0; i<size; i++){
       d.diskBlock[i].unBlock = malloc(BLOCK_BUFF_SIZE);
    }
    inttolitend(size,  (uint8_t*)(d.diskBlock->unBlock));

    for(i=0;i<size;i++){
        fwrite(d.diskBlock[i].unBlock ,BLOCK_BUFF_SIZE,1,f); 
    }



    return 1;
}

void inttolitend(uint32_t x, uint8_t* lit_int){

    lit_int[3] = ((x<<24) & 0xff);
    lit_int[2] = ((x<<16) & 0xff);
    lit_int[1] = ((x<<8)  & 0xff);
    lit_int[0] = ((x<<0)  & 0xff);

}