C - 读取文件中的结构

标签 c struct fwrite lseek

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

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;
};

tfs_create.c:

#include "tttfs.h"

uint8_t little[4];

int tttfs_create(int size, char *name);
void inttolitend(uint32_t x, uint8_t* lit_int);

int main(){
    tttfs_create(7, "disk.tfs");
    int f = 0;
    if((f=open("disk.tfs",O_RDONLY)) < -1) //I took this from an example.
       return 1;
    disk *d = malloc(sizeof(disk)); //Create a disk
    d->diskBlock = malloc(1024); //The block where I want to write the information from the file.
    lseek(f,0,SEEK_SET);//I want to read from the beginning
    read(f,d->diskBlock,1024); //I write all the information from the beginning to 1024th byte of my file
    int i;
    for(i=0; i<4; i++){
    printf("%d\n", (uint8_t)&d->diskBlock[i]);//print my result.
    }
}

int tttfs_create(int size, char *name){
    FILE *f = NULL;
    if ((f = fopen(name, "wb"))!=NULL)   /** si ouverture ok **/
    {
    disk *d = malloc(sizeof(disk));
    d->diskBlock = malloc(sizeof(block) * size);
    d->id = 1;
    int i;
    for(i = 0; i<size; i++){
       d->diskBlock[i].unBlock = malloc(sizeof(uint8_t) * 1024);
    }
    inttolitend(size, little);
    for(i = 0; i<4; i++){
       d->diskBlock[0].unBlock[i] = little[i];
    }
    for(i = 0; i<size; i++){
       fwrite(&d->diskBlock[i],sizeof(block),1,f);
    }
    }
    else
        printf("Erreur\n\n");
    return 0;
}

void inttolitend(uint32_t x, uint8_t* lit_int){
   lit_int[3] = (uint8_t)x / (256*256*256);
   lit_int[2] = (uint8_t)(x % (256*256*256)) / (256*256);
   lit_int[1] = (uint8_t)((x % (256*256*256)) % (256*256)) / 256;
   lit_int[0] = (uint8_t)((x % (256*256*256)) % (256*256)) % 256;
}

这样,我创建了一个包含 7 个 block 的磁盘,并将所有 7 个 block 写入我的文件中。在我的第一个 block 中,我以小端方式写入了磁盘的大小 (7)。所以 block[0] = 00、block[1] = 00、block[2] = 01、block[3] = 11 或类似的东西。

但是当我打印结果时我得到:

0
8
16
24

这不是我所期望的,我在没有read的情况下尝试了,并且得到了相同的结果。所以我的程序没有从磁盘写入信息。或者当我在磁盘中写入 block 时出现问题?

最佳答案

我不太确定你到底想要什么,但这应该可行

#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);

}

关于C - 读取文件中的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34707398/

相关文章:

c - 如何模拟多媒体按键(C)?

c - 将数组的大小传递给函数

c - 将已声明(未定义?)的结构重新定义为另一个结构

php - 使php中的新行写入文件

c - 将数据从文件写入 C 上的结构

c - 使用 struct 作为 "database"的任意数量单词(按字母顺序)的排序算法

c++ - 使用 C++ 编译器时遇到错误 "type qualifier specified more than once"

c - 二维结构 C 数组的未定义行为

c++ - 为什么我们需要 C++ 中的 `class`,而 `struct` 可用于实现相同的目的?

c - 如何为数组的任何未填充部分分配空字符,然后将其写入文件?